@@ -47,8 +47,6 @@ const unsigned short WANDER_RADIUS = 10;
4747const unsigned short WANDER_TRYINGS_SOLDIERS = 6 ;
4848const unsigned short WANDER_RADIUS_SOLDIERS = 15 ;
4949const unsigned short STRANDED_SOLDIER_RETURN_SEARCH_RADIUS_REDUCED = WANDER_RADIUS_SOLDIERS / 2 ;
50- const unsigned short STRANDED_SOLDIER_RETURN_SEARCH_RADIUS_EXTENDED = 30 ;
51- const unsigned short STRANDED_SOLDIER_RETURN_SEARCH_RADIUS_VERY_LARGE = 60 ;
5250
5351noFigure::noFigure (const Job job, const MapPoint pos, const unsigned char player, noRoadNode* const goal)
5452 : noMovable(NodalObjectType::Figure, pos), fs(FigureState::GotToGoal), job_(job), player(player), cur_rs(nullptr ),
@@ -467,7 +465,7 @@ void noFigure::StartWandering(const unsigned burned_wh_id)
467465 // 3x rumirren und eine Flagge suchen, wenn dann keine gefunden wurde, stirbt die Figur
468466 wander_way = WANDER_WAY_MIN + RANDOM_RAND (WANDER_WAY_MAX - WANDER_WAY_MIN);
469467 // Soldaten sind härter im Nehmen
470- wander_tryings = IsSoldier () ? WANDER_TRYINGS_SOLDIERS : WANDER_TRYINGS;
468+ wander_tryings = IsSoldier () ? GetStrandedSoldierReturnSearchTryings (world-> GetGGS ()) : WANDER_TRYINGS;
471469
472470 // Wenn wir stehen, zusätzlich noch loslaufen!
473471 if (waiting_for_free_node)
@@ -496,19 +494,35 @@ struct IsValidFlag
496494 bool operator ()(const noFlag* const flag) const { return flag && flag->GetPlayer () == playerId_; }
497495};
498496
497+ } // namespace
498+
499+ unsigned short GetStrandedSoldierReturnSearchTryings (const GlobalGameSettings& ggs)
500+ {
501+ switch (ggs.getSelection (AddonId::STRANDED_SOLDIER_RETURN_SEARCH))
502+ {
503+ case 2 : return 2 * WANDER_TRYINGS_SOLDIERS;
504+ case 3 : return 3 * WANDER_TRYINGS_SOLDIERS;
505+ default : return WANDER_TRYINGS_SOLDIERS;
506+ }
507+ }
508+
499509// / Radius used only for stranded soldiers looking for a return path to an own warehouse.
500510// / Normal worker wandering and non-soldier fallback behavior keep using WANDER_RADIUS.
501- unsigned short GetStrandedSoldierReturnSearchRadius (const GlobalGameSettings& ggs)
511+ unsigned short GetStrandedSoldierReturnSearchRadius (const GlobalGameSettings& ggs, const unsigned short wanderTryings )
502512{
503513 switch (ggs.getSelection (AddonId::STRANDED_SOLDIER_RETURN_SEARCH))
504514 {
505515 case 1 : return STRANDED_SOLDIER_RETURN_SEARCH_RADIUS_REDUCED;
506- case 2 : return STRANDED_SOLDIER_RETURN_SEARCH_RADIUS_EXTENDED;
507- case 3 : return STRANDED_SOLDIER_RETURN_SEARCH_RADIUS_VERY_LARGE;
516+ case 2 : return wanderTryings > WANDER_TRYINGS_SOLDIERS ? WANDER_RADIUS_SOLDIERS : 2 * WANDER_RADIUS_SOLDIERS;
517+ case 3 :
518+ if (wanderTryings > 2 * WANDER_TRYINGS_SOLDIERS)
519+ return WANDER_RADIUS_SOLDIERS;
520+ if (wanderTryings > WANDER_TRYINGS_SOLDIERS)
521+ return 2 * WANDER_RADIUS_SOLDIERS;
522+ return 4 * WANDER_RADIUS_SOLDIERS;
508523 default : return WANDER_RADIUS_SOLDIERS;
509524 }
510525}
511- } // namespace
512526
513527void noFigure::Wander ()
514528{
@@ -525,7 +539,7 @@ void noFigure::Wander()
525539 {
526540 // Soldaten sind härter im Nehmen
527541 const unsigned short wander_radius =
528- IsSoldier () ? GetStrandedSoldierReturnSearchRadius (world->GetGGS ()) : WANDER_RADIUS;
542+ IsSoldier () ? GetStrandedSoldierReturnSearchRadius (world->GetGGS (), wander_tryings ) : WANDER_RADIUS;
529543
530544 // Flaggen sammeln und dann zufällig eine auswählen
531545 const std::vector<noFlag*> flags =
0 commit comments