Skip to content

Commit 2ffddcc

Browse files
FlamefireFlow86
authored andcommitted
Fix check when stopping leaving soldiers
The check assumes only active soldiers start in "Job-state". This state is set when a figure arrived at its goal, and immediately for those not having a "fixed" goal, like attacking soldiers. But it also applies to e.g. trade-donkeys. So check for soldiers directly. Also rename `NoDefender` to `ResetDefender` to clarify meaning and remove the check for leaving defenders which cannot be met: The method is called before the defender is called.
1 parent efa8195 commit 2ffddcc

6 files changed

Lines changed: 13 additions & 13 deletions

File tree

libs/s25main/buildings/nobBaseMilitary.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -337,17 +337,17 @@ void nobBaseMilitary::StopLeavingSoldiers()
337337
{
338338
for(auto it = leave_house.begin(); it != leave_house.end();)
339339
{
340-
// Just take soldiers (in Job state) and no normal defenders which should always come out
341-
if((*it)->IsDoingJobWorks() && (*it)->GetGOT() != GO_Type::NofDefender)
340+
// Only take active soldiers
341+
if(!dynamic_cast<nofActiveSoldier*>(it->get()))
342+
++it;
343+
else
342344
{
343-
auto soldier = boost::dynamic_pointer_cast<nofActiveSoldier>(std::move(*it));
344-
RTTR_Assert(soldier);
345+
auto soldier = boost::static_pointer_cast<nofActiveSoldier>(std::move(*it));
345346
it = leave_house.erase(it);
346347
FigureLeft(*soldier);
347348

348349
soldier->InformTargetsAboutCancelling();
349350
AddActiveSoldier(std::move(soldier));
350-
} else
351-
++it;
351+
}
352352
}
353353
}

libs/s25main/buildings/nobBaseMilitary.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class nobBaseMilitary : public noBuilding
106106
/// zu kommen, diese Funktion sucht nach solchen Soldaten schickt einen ggf. zur Flagge, um anzugreifen
107107
void CheckArrestedAttackers();
108108
/// Der Verteidiger ist entweder tot oder wieder reingegegangen
109-
void NoDefender() { defender_ = nullptr; }
109+
void ResetDefender() { defender_ = nullptr; }
110110
/// Stop all soldiers going for an attack from leaving the house, i.e. put them from the queue back in
111111
void StopLeavingSoldiers();
112112

libs/s25main/buildings/nobBaseWarehouse.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,7 @@ void nobBaseWarehouse::AddActiveSoldier(std::unique_ptr<nofActiveSoldier> soldie
10261026

10271027
// Returned home
10281028
if(soldier.get() == defender_)
1029-
NoDefender();
1029+
ResetDefender();
10301030
else
10311031
{
10321032
// Ggf. war er auf Mission

libs/s25main/buildings/nobMilitary.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ void nobMilitary::AddActiveSoldier(std::unique_ptr<nofActiveSoldier> soldier)
785785

786786
// Returned home
787787
if(soldier.get() == defender_)
788-
NoDefender();
788+
ResetDefender();
789789
else if(helpers::contains(troops_on_mission, soldier.get()))
790790
{
791791
troops_on_mission.remove(soldier.get());

libs/s25main/figures/nofDefender.cpp

Lines changed: 2 additions & 2 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

@@ -152,7 +152,7 @@ void nofDefender::LostFighting()
152152
// Notify building if it still exists
153153
if(building)
154154
{
155-
building->NoDefender();
155+
building->ResetDefender();
156156
// A military building potentially needs to get new soldiers if this wasn't the last one
157157
if(BuildingProperties::IsMilitary(building->GetBuildingType()))
158158
{

libs/s25main/figures/nofDefender.h

Lines changed: 2 additions & 2 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

@@ -43,7 +43,7 @@ class nofDefender : public nofActiveSoldier
4343

4444
GO_Type GetGOT() const final { return GO_Type::NofDefender; }
4545

46-
/// Inform that a new attacker arrived at the flag while we are going on such that we can come right back
46+
/// Inform that a new attacker arrived at the flag while we are going in such that we can come right back
4747
void NewAttacker(nofAttacker& attacker) { this->attacker = &attacker; }
4848
/// The attacker won't come to the flag anymore
4949
void AttackerArrested();

0 commit comments

Comments
 (0)