Skip to content

Commit efa8195

Browse files
FlamefireFlow86
authored andcommitted
Cancel leaving soldiers before requesting defender
Soldiers are stopped when a defender is coming out. If no defender is found the leaving soldiers are checked. So it is better to first stop the leaving soldiers and then choose from all of them. Also remove `nofAggressiveDefender::NeedForHomeDefence` which is a wrapper to `InformTargetsAboutCancelling` only used in a single place which is now redundant.
1 parent 2d82f08 commit efa8195

5 files changed

Lines changed: 23 additions & 49 deletions

File tree

libs/s25main/buildings/nobBaseMilitary.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -221,27 +221,22 @@ MapPoint nobBaseMilitary::FindAnAttackerPlace(unsigned short& ret_radius, const
221221

222222
bool nobBaseMilitary::CallDefender(nofAttacker& attacker)
223223
{
224+
// Block soldiers leaving this building e.g. for attacks or aggressive defending
225+
StopLeavingSoldiers();
224226
// Use existing defender (e.g. just going back in) if possible
225227
if(defender_)
226228
{
227229
defender_->NewAttacker(attacker);
228-
// Block soldiers leaving this building e.g. for attacks or aggressive defending
229-
StopLeavingSoldiers();
230-
return true;
231-
} else
232-
{
233-
auto defender = ProvideDefender(attacker);
234-
if(!defender)
235-
return false; // Building empty -> Can be conquered
236-
237-
// Block soldiers leaving this building e.g. for attacks or aggressive defending
238-
StopLeavingSoldiers();
239-
// Soldat muss noch rauskommen
240-
defender_ = defender.get();
241-
AddLeavingFigure(std::move(defender));
242-
243230
return true;
244231
}
232+
auto defender = ProvideDefender(attacker);
233+
if(!defender)
234+
return false; // Building empty -> Can be conquered
235+
236+
// Soldat muss noch rauskommen
237+
defender_ = defender.get();
238+
AddLeavingFigure(std::move(defender));
239+
return true;
245240
}
246241

247242
nofAttacker* nobBaseMilitary::FindAttackerNearBuilding()

libs/s25main/buildings/nobBaseWarehouse.cpp

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,28 +1098,22 @@ std::unique_ptr<nofDefender> nobBaseWarehouse::ProvideDefender(nofAttacker& atta
10981098
}
10991099
}
11001100

1101-
// Kein Soldat gefunden, als letzten Hoffnung die Soldaten nehmen, die ggf in der Warteschlange noch hängen
1101+
// If no soldier was found take a soldier that is about to leave (to another building)
11021102
for(auto it = leave_house.begin(); it != leave_house.end(); ++it)
11031103
{
1104-
std::unique_ptr<nofSoldier> soldier;
1105-
if((*it)->GetGOT() == GO_Type::NofAggressivedefender)
1104+
if((*it)->GetGOT() == GO_Type::NofPassivesoldier)
11061105
{
1107-
soldier = boost::static_pointer_cast<nofSoldier>(std::move(*it));
1108-
static_cast<nofAggressiveDefender&>(*soldier).NeedForHomeDefence();
1109-
} else if((*it)->GetGOT() == GO_Type::NofPassivesoldier)
1110-
soldier = boost::static_pointer_cast<nofSoldier>(std::move(*it));
1111-
else
1112-
continue;
1106+
std::unique_ptr<nofSoldier> soldier = boost::static_pointer_cast<nofSoldier>(std::move(*it));
11131107

1114-
leave_house.erase(it); // Only allowed in the loop as we return now
1115-
soldier->Abrogate();
1108+
leave_house.erase(it); // Only allowed in the loop as we return now
1109+
soldier->Abrogate();
11161110

1117-
auto defender = std::make_unique<nofDefender>(pos, player, *this, soldier->GetRank(), attacker);
1118-
defender->SetArmor(soldier->HasArmor());
1119-
soldier->Destroy();
1120-
return defender;
1111+
auto defender = std::make_unique<nofDefender>(pos, player, *this, soldier->GetRank(), attacker);
1112+
defender->SetArmor(soldier->HasArmor());
1113+
soldier->Destroy();
1114+
return defender;
1115+
}
11211116
}
1122-
11231117
return nullptr;
11241118
}
11251119

libs/s25main/buildings/nobMilitary.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,14 +1013,7 @@ std::unique_ptr<nofDefender> nobMilitary::ProvideDefender(nofAttacker& attacker)
10131013
{
10141014
nofPassiveSoldier* soldier = ChooseSoldier();
10151015
if(!soldier)
1016-
{
1017-
/// Soldaten, die noch auf Mission gehen wollen, canceln und für die Verteidigung mit einziehen
1018-
StopLeavingSoldiers();
1019-
// Nochmal versuchen
1020-
soldier = ChooseSoldier();
1021-
if(!soldier)
1022-
return nullptr;
1023-
}
1016+
return nullptr;
10241017

10251018
auto defender = std::make_unique<nofDefender>(*soldier, attacker);
10261019

libs/s25main/figures/nofAggressiveDefender.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2005 - 2024 Settlers Freaks (sf-team at siedler25.org)
1+
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
22
//
33
// SPDX-License-Identifier: GPL-2.0-or-later
44

@@ -251,11 +251,6 @@ void nofAggressiveDefender::AttackerLost()
251251
// TODO(Replay) When still in leave queue abort to avoid going out and right back
252252
}
253253

254-
void nofAggressiveDefender::NeedForHomeDefence()
255-
{
256-
InformTargetsAboutCancelling();
257-
}
258-
259254
void nofAggressiveDefender::InformTargetsAboutCancelling()
260255
{
261256
nofActiveSoldier::InformTargetsAboutCancelling();

libs/s25main/figures/nofAggressiveDefender.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2005 - 2024 Settlers Freaks (sf-team at siedler25.org)
1+
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
22
//
33
// SPDX-License-Identifier: GPL-2.0-or-later
44

@@ -69,9 +69,6 @@ class nofAggressiveDefender : public nofActiveSoldier
6969
void MissAggressiveDefendingContinueWalking();
7070
/// Wenn der jeweils andere Soldat, mit dem man kämpfen wollte, nicht mehr kommen kann
7171
void AttackerLost();
72-
/// Ich befinde mich noch im Lagerhaus in der Warteschlange und muss mein HQ etc. verteidigen
73-
/// Mission muss also abgebrochen werden
74-
void NeedForHomeDefence();
7572

7673
// Debugging
7774
const nofAttacker* GetAttacker() const { return attacker; }

0 commit comments

Comments
 (0)