@@ -221,8 +221,23 @@ MapPoint nobBaseMilitary::FindAnAttackerPlace(unsigned short& ret_radius, const
221221
222222bool nobBaseMilitary::CallDefender (nofAttacker& attacker)
223223{
224- // Block soldiers leaving this building e.g. for attacks or aggressive defending
225- StopLeavingSoldiers ();
224+ // Stop attacking soldiers (including aggressive defenders) from leaving this building
225+ for (auto it = leave_house.begin (); it != leave_house.end ();)
226+ {
227+ if (!dynamic_cast <nofActiveSoldier*>(it->get ()))
228+ ++it;
229+ else
230+ {
231+ auto soldier = boost::static_pointer_cast<nofActiveSoldier>(std::move (*it));
232+ // At this point there shouldn't be a defender leaving as we are just requesting one
233+ RTTR_Assert (soldier->GetGOT () != GO_Type::NofDefender);
234+ it = leave_house.erase (it);
235+ FigureLeft (*soldier);
236+
237+ soldier->InformTargetsAboutCancelling ();
238+ AddActiveSoldier (std::move (soldier));
239+ }
240+ }
226241 // Use existing defender (e.g. just going back in) if possible
227242 if (defender_)
228243 {
@@ -332,22 +347,3 @@ bool nobBaseMilitary::IsOnMission(const nofActiveSoldier& soldier) const
332347{
333348 return helpers::contains (troops_on_mission, &soldier);
334349}
335-
336- void nobBaseMilitary::StopLeavingSoldiers ()
337- {
338- for (auto it = leave_house.begin (); it != leave_house.end ();)
339- {
340- // Only take active soldiers
341- if (!dynamic_cast <nofActiveSoldier*>(it->get ()))
342- ++it;
343- else
344- {
345- auto soldier = boost::static_pointer_cast<nofActiveSoldier>(std::move (*it));
346- it = leave_house.erase (it);
347- FigureLeft (*soldier);
348-
349- soldier->InformTargetsAboutCancelling ();
350- AddActiveSoldier (std::move (soldier));
351- }
352- }
353- }
0 commit comments