Skip to content

Commit 25cf29a

Browse files
committed
gameplay: stage stranded soldier return search
1 parent 68e24dd commit 25cf29a

3 files changed

Lines changed: 75 additions & 8 deletions

File tree

libs/s25main/figures/noFigure.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ const unsigned short WANDER_RADIUS = 10;
4747
const unsigned short WANDER_TRYINGS_SOLDIERS = 6;
4848
const unsigned short WANDER_RADIUS_SOLDIERS = 15;
4949
const 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

5351
noFigure::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

513527
void 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 =

libs/s25main/figures/noFigure.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ constexpr auto maxEnumValue(FigureState)
3030
}
3131

3232
class SerializedGameData;
33+
class GlobalGameSettings;
34+
35+
unsigned short GetStrandedSoldierReturnSearchTryings(const GlobalGameSettings& ggs);
36+
unsigned short GetStrandedSoldierReturnSearchRadius(const GlobalGameSettings& ggs, unsigned short wanderTryings);
3337

3438
// Stellt einen Menschen dar
3539
class noFigure : public noMovable

tests/s25Main/integration/testFigures.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
// SPDX-License-Identifier: GPL-2.0-or-later
44

55
#include "GamePlayer.h"
6+
#include "GlobalGameSettings.h"
67
#include "PointOutput.h"
78
#include "RttrForeachPt.h"
9+
#include "addons/const_addons.h"
810
#include "buildings/nobBaseWarehouse.h"
911
#include "factories/BuildingFactory.h"
1012
#include "figures/noFigure.h"
@@ -21,6 +23,53 @@
2123

2224
BOOST_AUTO_TEST_SUITE(FigureTests)
2325

26+
BOOST_AUTO_TEST_CASE(StrandedSoldierReturnSearchDefaultKeepsNormalTryingsAndRadius)
27+
{
28+
GlobalGameSettings ggs;
29+
ggs.setSelection(AddonId::STRANDED_SOLDIER_RETURN_SEARCH, 0);
30+
31+
BOOST_TEST(GetStrandedSoldierReturnSearchTryings(ggs) == 6u);
32+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 6) == 15u);
33+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 1) == 15u);
34+
}
35+
36+
BOOST_AUTO_TEST_CASE(StrandedSoldierReturnSearchReducedKeepsNormalTryingsAndFixedHalfRadius)
37+
{
38+
GlobalGameSettings ggs;
39+
ggs.setSelection(AddonId::STRANDED_SOLDIER_RETURN_SEARCH, 1);
40+
41+
BOOST_TEST(GetStrandedSoldierReturnSearchTryings(ggs) == 6u);
42+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 12) == 7u);
43+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 6) == 7u);
44+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 1) == 7u);
45+
}
46+
47+
BOOST_AUTO_TEST_CASE(StrandedSoldierReturnSearchExtendedEscalatesAfterNormalTryings)
48+
{
49+
GlobalGameSettings ggs;
50+
ggs.setSelection(AddonId::STRANDED_SOLDIER_RETURN_SEARCH, 2);
51+
52+
BOOST_TEST(GetStrandedSoldierReturnSearchTryings(ggs) == 12u);
53+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 12) == 15u);
54+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 7) == 15u);
55+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 6) == 30u);
56+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 1) == 30u);
57+
}
58+
59+
BOOST_AUTO_TEST_CASE(StrandedSoldierReturnSearchVeryLargeEscalatesThroughThreeStages)
60+
{
61+
GlobalGameSettings ggs;
62+
ggs.setSelection(AddonId::STRANDED_SOLDIER_RETURN_SEARCH, 3);
63+
64+
BOOST_TEST(GetStrandedSoldierReturnSearchTryings(ggs) == 18u);
65+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 18) == 15u);
66+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 13) == 15u);
67+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 12) == 30u);
68+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 7) == 30u);
69+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 6) == 60u);
70+
BOOST_TEST(GetStrandedSoldierReturnSearchRadius(ggs, 1) == 60u);
71+
}
72+
2473
BOOST_FIXTURE_TEST_CASE(DestroyWHWithFigure, WorldWithGCExecution2P)
2574
{
2675
world.GetPlayer(curPlayer).GetFirstWH()->AddToInventory(PeopleCounts::make(Job::Helper, 10), true);

0 commit comments

Comments
 (0)