diff --git a/main/midnight/tests/CMakeLists.txt b/main/midnight/tests/CMakeLists.txt index a12bce2e..5b5ab171 100644 --- a/main/midnight/tests/CMakeLists.txt +++ b/main/midnight/tests/CMakeLists.txt @@ -8,19 +8,35 @@ if(TESTS) FetchContent_MakeAvailable(Catch2) - FILE(GLOB HDR_TESTS1 tests/${APP_NAME}/*.h) - FILE(GLOB SRC_TESTS1 tests/${APP_NAME}/*.cpp) - FILE(GLOB HDR_TESTS2 tests/*.h) - FILE(GLOB SRC_TESTS2 tests/*.cpp) + FILE(GLOB HDR tests/*.h) + FILE(GLOB SRC tests/*.cpp) + + FILE(GLOB_RECURSE HDR_APP tests/${APP_NAME}/*.h) + FILE(GLOB_RECURSE SRC_APP tests/${APP_NAME}/*.cpp) + + FILE(GLOB HDR_MOCKS tests/mocks/*.h) + FILE(GLOB SRC_MOCKS tests/mocks/*.cpp) + + FILE(GLOB HDR_STEPS tests/steps/*.h) + FILE(GLOB SRC_STEPS tests/steps/*.cpp) + + FILE(GLOB HDR_TESTS_TESTS tests/tests/*.h) + FILE(GLOB SRC_TESTS_TESTS tests/tests/*.cpp) list(APPEND GAME_HEADER - ${HDR_TESTS1} - ${HDR_TESTS2} + ${HDR} + ${HDR_APP} + ${HDR_TESTS} + ${HDR_STEPS} + ${HDR_MOCKS} ) list(APPEND GAME_SOURCE - ${SRC_TESTS1} - ${SRC_TESTS2} + ${SRC} + ${SRC_APP} + ${SRC_TESTS} + ${SRC_STEPS} + ${SRC_MOCKS} ) add_compile_options(-D_UNIT_TESTS_) diff --git a/main/midnight/tests/midnight/battle_steps.cpp b/main/midnight/tests/midnight/steps/battle_steps.cpp similarity index 90% rename from main/midnight/tests/midnight/battle_steps.cpp rename to main/midnight/tests/midnight/steps/battle_steps.cpp index 940d2fd5..accaf6bd 100644 --- a/main/midnight/tests/midnight/battle_steps.cpp +++ b/main/midnight/tests/midnight/steps/battle_steps.cpp @@ -6,10 +6,10 @@ // #include "battle_steps.h" -#include "../../src/tme/baseinc/processor_battle.h" +#include "../../../src/tme/baseinc/processor_battle.h" -static const LPCSTR ch_leader = "CH_LUXOR"; -static const LPCSTR ch_follower = "CH_MORKIN"; +static const string ch_leader = "CH_LUXOR"; +static const string ch_follower = "CH_MORKIN"; static mxcharacter* leader = nullptr; static mxcharacter* follower = nullptr; static mxgridref previous_location; diff --git a/main/midnight/tests/midnight/battle_steps.h b/main/midnight/tests/midnight/steps/battle_steps.h similarity index 94% rename from main/midnight/tests/midnight/battle_steps.h rename to main/midnight/tests/midnight/steps/battle_steps.h index e31e5bda..4b6330ec 100644 --- a/main/midnight/tests/midnight/battle_steps.h +++ b/main/midnight/tests/midnight/steps/battle_steps.h @@ -7,7 +7,7 @@ #pragma once -#include "../tme_steps.h" +#include "../../steps/tme_steps.h" struct BattleSteps { diff --git a/main/midnight/tests/midnight/common_steps.cpp b/main/midnight/tests/midnight/steps/common_steps.cpp similarity index 100% rename from main/midnight/tests/midnight/common_steps.cpp rename to main/midnight/tests/midnight/steps/common_steps.cpp diff --git a/main/midnight/tests/midnight/common_steps.h b/main/midnight/tests/midnight/steps/common_steps.h similarity index 96% rename from main/midnight/tests/midnight/common_steps.h rename to main/midnight/tests/midnight/steps/common_steps.h index 6d34a7aa..5799a913 100644 --- a/main/midnight/tests/midnight/common_steps.h +++ b/main/midnight/tests/midnight/steps/common_steps.h @@ -7,7 +7,7 @@ #pragma once -#include "../tme_steps.h" +#include "../../steps/tme_steps.h" class LOMStep { diff --git a/main/midnight/tests/midnight/battle_tests.cpp b/main/midnight/tests/midnight/tests/battle_tests.cpp similarity index 98% rename from main/midnight/tests/midnight/battle_tests.cpp rename to main/midnight/tests/midnight/tests/battle_tests.cpp index 1504c2d7..b73707a9 100644 --- a/main/midnight/tests/midnight/battle_tests.cpp +++ b/main/midnight/tests/midnight/tests/battle_tests.cpp @@ -1,11 +1,11 @@ // // battle_tests.cpp -// revenge +// midnight // // Created by Chris Wild on 02/09/2023. // -#include "battle_steps.h" +#include "../steps/battle_steps.h" // GIVEN a hard game // AND a lord has followers diff --git a/main/midnight/tests/midnight/recruitment_tests.cpp b/main/midnight/tests/midnight/tests/recruitment_tests.cpp similarity index 98% rename from main/midnight/tests/midnight/recruitment_tests.cpp rename to main/midnight/tests/midnight/tests/recruitment_tests.cpp index 188b6de9..b5ec783a 100644 --- a/main/midnight/tests/midnight/recruitment_tests.cpp +++ b/main/midnight/tests/midnight/tests/recruitment_tests.cpp @@ -4,8 +4,8 @@ // // Created by Chris Wild on 25/03/2023. // -#include "common_steps.h" -#include "../map_steps.h" +#include "../steps/common_steps.h" +#include "../../steps/map_steps.h" SCENARIO("Morkin can recruit Shadows") { diff --git a/main/midnight/tests/midnight/standard_tests.cpp b/main/midnight/tests/midnight/tests/standard_tests.cpp similarity index 97% rename from main/midnight/tests/midnight/standard_tests.cpp rename to main/midnight/tests/midnight/tests/standard_tests.cpp index eeb9792b..9f45f03e 100644 --- a/main/midnight/tests/midnight/standard_tests.cpp +++ b/main/midnight/tests/midnight/tests/standard_tests.cpp @@ -5,7 +5,7 @@ // Created by Chris Wild on 03/01/2021. // -#include "common_steps.h" +#include "../steps/common_steps.h" TEST_CASE( "Lom Scenario has been setup corretly" ) { diff --git a/main/midnight/tests/midnight/victory_tests.cpp b/main/midnight/tests/midnight/tests/victory_tests.cpp similarity index 99% rename from main/midnight/tests/midnight/victory_tests.cpp rename to main/midnight/tests/midnight/tests/victory_tests.cpp index 143da2e0..e5cc104c 100644 --- a/main/midnight/tests/midnight/victory_tests.cpp +++ b/main/midnight/tests/midnight/tests/victory_tests.cpp @@ -11,7 +11,7 @@ // their command." // -#include "common_steps.h" +#include "../steps/common_steps.h" void Victory(std::string text) { diff --git a/main/midnight/tests/mocks.cpp b/main/midnight/tests/mocks/mocks.cpp similarity index 100% rename from main/midnight/tests/mocks.cpp rename to main/midnight/tests/mocks/mocks.cpp diff --git a/main/midnight/tests/mocks.h b/main/midnight/tests/mocks/mocks.h similarity index 94% rename from main/midnight/tests/mocks.h rename to main/midnight/tests/mocks/mocks.h index fbbe4140..518cbf36 100644 --- a/main/midnight/tests/mocks.h +++ b/main/midnight/tests/mocks/mocks.h @@ -6,8 +6,8 @@ // #pragma once -#include "../src/system/moonring.h" -#include "../src/ui/uipanel.h" +#include "../../src/system/moonring.h" +#include "../../src/ui/uipanel.h" class storymanagermock : public storymanager { diff --git a/main/midnight/tests/mocks/mocks_entity.h b/main/midnight/tests/mocks/mocks_entity.h new file mode 100644 index 00000000..8bf8ec4d --- /dev/null +++ b/main/midnight/tests/mocks/mocks_entity.h @@ -0,0 +1,92 @@ +// +// mocks.hpp +// midnight +// +// Created by Chris Wild on 26/10/2023 +// +#pragma once + +#if defined(_LOM_) + #include "../../../../src/tme/scenarios/lom/scenario_lom_internal.h" + + #define BASE_CHARACTER mxcharacter + #define BASE_FACTORY lom_entityfactory + +#endif + +using namespace std; +using namespace tme; + +class MockData { +public: + void Clear() { + events.clear(); + properties.clear(); + } + +public: + vector events; + map properties; +}; + + +#define TRIGGERED(x) \ + SetEvent(__FUNCTION__); \ + BASE_CHARACTER::x(); + +#define TRACK_VOID(x) \ + virtual void x() override { SetEvent(__FUNCTION__); BASE_CHARACTER::x(); } + +#define HANDLE_BOOL(x) \ + virtual bool x() const override { BOOL_OVERRIDE_CHECK(x); } + +#define BOOL_OVERRIDE_CHECK(x) \ + if ( GetProperty(__FUNCTION__) == "false" ) return false; \ + if ( GetProperty(__FUNCTION__) == "true" ) return true; \ + BASE_CHARACTER::x() + +class mockcharacter : public BASE_CHARACTER +{ +public: + void SetEvent( string name ) { + mockData.events.push_back(name); + } + + string GetProperty( string name ) const { + return mockData.properties.find(name) == mockData.properties.end() + ? "" + : mockData.properties.at(name); + } + + bool HasEvent(string event) + { + auto vec = mockData.events; + return ( std::find(vec.begin(), vec.end(), event) != vec.end() ); + } + + // + // + // + + TRACK_VOID ( Cmd_Dead ); + TRACK_VOID ( LostFight ); + TRACK_VOID ( Dismount ); + + HANDLE_BOOL ( ShouldLoseHorse ); + HANDLE_BOOL ( ShouldDieInFight ); + + public: + MockData mockData; +}; + +class mockentityfactory : public BASE_FACTORY +{ +public: + mxentity* Create(id_type_t type) override + { + if ( type == IDT_CHARACTER ) + return static_cast(new mockcharacter); + + return BASE_FACTORY::Create(type); + } +}; diff --git a/main/midnight/tests/revenge/battle_steps.cpp b/main/midnight/tests/revenge/steps/battle_steps.cpp similarity index 100% rename from main/midnight/tests/revenge/battle_steps.cpp rename to main/midnight/tests/revenge/steps/battle_steps.cpp diff --git a/main/midnight/tests/revenge/battle_steps.h b/main/midnight/tests/revenge/steps/battle_steps.h similarity index 100% rename from main/midnight/tests/revenge/battle_steps.h rename to main/midnight/tests/revenge/steps/battle_steps.h diff --git a/main/midnight/tests/revenge/common_steps.cpp b/main/midnight/tests/revenge/steps/common_steps.cpp similarity index 100% rename from main/midnight/tests/revenge/common_steps.cpp rename to main/midnight/tests/revenge/steps/common_steps.cpp diff --git a/main/midnight/tests/revenge/common_steps.h b/main/midnight/tests/revenge/steps/common_steps.h similarity index 100% rename from main/midnight/tests/revenge/common_steps.h rename to main/midnight/tests/revenge/steps/common_steps.h diff --git a/main/midnight/tests/revenge/battle_tests.cpp b/main/midnight/tests/revenge/tests/battle_tests.cpp similarity index 100% rename from main/midnight/tests/revenge/battle_tests.cpp rename to main/midnight/tests/revenge/tests/battle_tests.cpp diff --git a/main/midnight/tests/revenge/victory_tests.cpp b/main/midnight/tests/revenge/tests/victory_tests.cpp similarity index 100% rename from main/midnight/tests/revenge/victory_tests.cpp rename to main/midnight/tests/revenge/tests/victory_tests.cpp diff --git a/main/midnight/tests/map_steps.cpp b/main/midnight/tests/steps/map_steps.cpp similarity index 50% rename from main/midnight/tests/map_steps.cpp rename to main/midnight/tests/steps/map_steps.cpp index cac2c5de..a2184098 100644 --- a/main/midnight/tests/map_steps.cpp +++ b/main/midnight/tests/steps/map_steps.cpp @@ -12,3 +12,13 @@ void MapStep::ClearObjectFromLocation(loc_t loc) { tme::mx->gamemap->GetAt(loc).object = OB_NONE; } + +void MapStep::SetObjectAtLocation(loc_t loc, mxthing_t thing) +{ + tme::mx->gamemap->GetAt(loc).object = thing; +} + +mxthing_t MapStep::GetObjectAtLocation(loc_t loc) +{ + return (mxthing_t)tme::mx->gamemap->GetAt(loc).object; +} diff --git a/main/midnight/tests/map_steps.h b/main/midnight/tests/steps/map_steps.h similarity index 62% rename from main/midnight/tests/map_steps.h rename to main/midnight/tests/steps/map_steps.h index ba3cf8fd..20d401f2 100644 --- a/main/midnight/tests/map_steps.h +++ b/main/midnight/tests/steps/map_steps.h @@ -13,4 +13,7 @@ class MapStep { public: static void ClearObjectFromLocation(loc_t loc); + static void SetObjectAtLocation(loc_t loc, mxthing_t thing); + static mxthing_t GetObjectAtLocation(loc_t loc); + }; diff --git a/main/midnight/tests/tme_steps.cpp b/main/midnight/tests/steps/tme_steps.cpp similarity index 55% rename from main/midnight/tests/tme_steps.cpp rename to main/midnight/tests/steps/tme_steps.cpp index bf49a587..ffcaf128 100644 --- a/main/midnight/tests/tme_steps.cpp +++ b/main/midnight/tests/steps/tme_steps.cpp @@ -6,12 +6,20 @@ // #include "tme_steps.h" +#include "../mocks/mocks_entity.h" void TMEStep::NewStory(mxdifficulty_t difficulty) { TME_DeInit(); - TME_Init(RF_DEFAULT, difficulty); + + //TME_Init(RF_DEFAULT, difficulty); + + TME_Init(RF_DEFAULT, difficulty, [] { + tme::mx->entityfactory = new mockentityfactory(); + }); + + } void TMEStep::NightFalls() @@ -25,7 +33,7 @@ void TMEStep::CurrentLordIsDead() TME_RefreshCurrentCharacter(); } -void TMEStep::SetCurrentLord(LPCSTR name) +void TMEStep::SetCurrentLord(const string& name) { auto lord = GetCharacter(name); TME_CurrentCharacter(lord->SafeIdt(lord)); @@ -52,25 +60,25 @@ void TMEStep::GameLost() #endif } -void TMEStep::LordCarryingObject(LPCSTR name, mxthing_t thing) +void TMEStep::LordCarryingObject(const string& name, mxthing_t thing) { auto lord = GetCharacter(name); lord->carrying = tme::mx->ObjectById(thing); } -void TMEStep::LordCarryingObject(LPCSTR name, LPCSTR object) +void TMEStep::LordCarryingObject(const string& name, const string& object) { auto lord = GetCharacter(name); lord->carrying = GetObject(object); } -void TMEStep::LordAtLocation(LPCSTR name, LPCSTR location) +void TMEStep::LordAtLocation(const string& name, const string& location) { auto lord = GetCharacter(name); lord->Location( GetEntity(location)->Location() ); } -void TMEStep::LordsAtSameLocation(LPCSTR name1, LPCSTR name2) +void TMEStep::LordsAtSameLocation(const string& name1, const string& name2) { auto lord1 = GetCharacter(name1); auto lord2 = GetCharacter(name2); @@ -79,13 +87,13 @@ void TMEStep::LordsAtSameLocation(LPCSTR name1, LPCSTR name2) } -void TMEStep::LordAtLocation(LPCSTR name, loc_t location) +void TMEStep::LordAtLocation(const string& name, loc_t location) { auto lord = GetCharacter(name); lord->Location( location ); } -void TMEStep::LordIsNotRecruited(LPCSTR name) +void TMEStep::LordIsNotRecruited(const string& name) { auto lord = GetCharacter(name); lord->Flags().Reset(cf_recruited); @@ -93,7 +101,7 @@ void TMEStep::LordIsNotRecruited(LPCSTR name) lord->liege = nullptr ; } -void TMEStep::LordIsRecruited(LPCSTR name) +void TMEStep::LordIsRecruited(const string& name) { auto lord = GetCharacter(name); lord->Flags().Set(cf_recruited); @@ -101,19 +109,19 @@ void TMEStep::LordIsRecruited(LPCSTR name) lord->liege = GetCharacter(ch_luxor); } -void TMEStep::LordPerformsApproach(LPCSTR name1, LPCSTR name2) +void TMEStep::LordPerformsApproach(const string& name1, const string& name2) { auto lord = GetCharacter(name1); lord->Cmd_Approach(GetCharacter(name2)); } -bool TMEStep::LordHasBeenRecruited(LPCSTR name) +bool TMEStep::LordHasBeenRecruited(const string& name) { auto lord = GetCharacter(name); return lord->Flags().Is(cf_recruited); } -void TMEStep::LordsIsLookingAt(LPCSTR name1, LPCSTR name2) +void TMEStep::LordsIsLookingAt(const string& name1, const string& name2) { auto lord1 = GetCharacter(name1); auto lord2 = GetCharacter(name2); @@ -125,25 +133,31 @@ void TMEStep::LordsIsLookingAt(LPCSTR name1, LPCSTR name2) lord1->looking = DR_NORTH; } -void TMEStep::LordMovesForward(LPCSTR name) +void TMEStep::LordMovesForward(const string& name) { auto lord1 = GetCharacter(name); lord1->Cmd_MoveForward(); } -void TMEStep::LordIsDead(LPCSTR name) +void TMEStep::LordFights(const string& name) +{ + auto lord1 = GetCharacter(name); + lord1->Cmd_Fight(); +} + +void TMEStep::LordIsDead(const string& name) { GetCharacter(name)->Cmd_Dead(); } -void TMEStep::LordKilledByObject(LPCSTR name, LPCSTR killedby) +void TMEStep::LordKilledByObject(const string& name, const string& killedby) { auto lord = GetCharacter(name); lord->Cmd_Dead(); lord->killedbyobject = GetObject(killedby); } -void TMEStep::LordHasFollowers(LPCSTR lord, vector names) +void TMEStep::LordHasFollowers(const string& lord, vector names) { auto leader = GetCharacter(lord); for (string &name : names) { @@ -158,3 +172,28 @@ void TMEStep::LordHasFollowers(LPCSTR lord, vector names) lord->Cmd_Follow(leader); } } + +void TMEStep::LordShouldDieInFight(const string& lord) +{ + auto mock = GetMockCharacter(lord); + mock->mockData.properties["ShouldDieInFight"] = "true"; +} + +void TMEStep::LordShouldNotDieInFight(const string& lord) +{ + auto mock = GetMockCharacter(lord); + mock->mockData.properties["ShouldDieInFight"] = "false"; +} + +void TMEStep::LordShouldLoseHorse(const string& lord) +{ + auto mock = GetMockCharacter(lord); + mock->mockData.properties["ShouldLoseHorse"] = "true"; +} + +void TMEStep::LordShouldNotLoseHorse(const string& lord) +{ + auto mock = GetMockCharacter(lord); + mock->mockData.properties["ShouldLoseHorse"] = "false"; +} + diff --git a/main/midnight/tests/steps/tme_steps.h b/main/midnight/tests/steps/tme_steps.h new file mode 100644 index 00000000..67599614 --- /dev/null +++ b/main/midnight/tests/steps/tme_steps.h @@ -0,0 +1,109 @@ +// +// steps.h +// midnight +// +// Created by Chris Wild on 04/01/2021. +// +#pragma once + + +#include "catch2/catch.hpp" +#include "../../src/system/moonring.h" +#include "../../src/tme/tme_interface.h" +#include "../../src/tme/baseinc/tme_internal.h" +#include "../mocks/mocks_entity.h" + +#if defined(_LOM_) + #include "../midnight/steps/common_steps.h" +#endif +#if defined(_DDR_) + #include "../revenge/steps/common_steps.h" +#endif + +#include + +using namespace tme; +using namespace std; +extern mxengine* mx; + + +class TMEStep +{ +public: + static void NewStory(mxdifficulty_t difficulty = DF_NORMAL); + + static void GivenNormalGame() { NewStory(); } + static void GivenHardGame() { NewStory(DF_HARD); } + + static void NightFalls(); + static void CurrentLordIsDead(); + static void SetCurrentLord(const string& name); + static void GameLost(); + static void GameWon(); + + static void LordCarryingObject(const string& name, mxthing_t thing); + static void LordCarryingObject(const string& name, const string& object); + + static void LordAtLocation(const string& name, const string& location); + static void LordAtLocation(const string& name, loc_t location); + static void LordsAtSameLocation(const string& name1, const string& name2); + + static void LordIsNotRecruited(const string& name); + static void LordIsRecruited(const string& name); + static void LordPerformsApproach(const string& name1, const string& name2 = ""); + static void LordsIsLookingAt(const string& name1, const string& name2); + static void LordMovesForward(const string& name); + static void LordFights(const string& name); + static void LordIsDead(const string& name); + static void LordKilledByObject(const string& name, const string& killedby); + + // Grouping + static void LordHasFollowers(const string& lord, vector names); + + + // mocks + static void LordShouldDieInFight(const string& lord); + static void LordShouldNotDieInFight(const string& lord); + static void LordShouldLoseHorse(const string& lord); + static void LordShouldNotLoseHorse(const string& lord); + // + + + // + static bool LordHasBeenRecruited(const string& name); + + // + static constexpr LPCSTR ch_morkin = "CH_MORKIN"; + static constexpr LPCSTR ch_luxor = "CH_LUXOR"; + static constexpr LPCSTR ch_rorthron = "CH_RORTHRON"; +#if defined(_LOM_) + static constexpr LPCSTR ch_shadows = "CH_SHADOWS"; +#endif + + static constexpr LPCSTR ob_wolves = "OB_WOLVES"; +}; + +template T* GetEntity(const string& name) +{ + return static_cast(tme::mx->EntityByName(name)); +} + +inline mxcharacter* GetCharacter(const string& name) +{ + return GetEntity(name); +} + +inline mxstronghold* GetStronghold(const string& name) +{ + return GetEntity(name); +} + +inline mxobject* GetObject(const string& name) +{ + return GetEntity(name); +} + +inline mockcharacter* GetMockCharacter(const string& lord) +{ + return static_cast(GetCharacter(lord)); +} diff --git a/main/midnight/tests/ui_steps.cpp b/main/midnight/tests/steps/ui_steps.cpp similarity index 100% rename from main/midnight/tests/ui_steps.cpp rename to main/midnight/tests/steps/ui_steps.cpp diff --git a/main/midnight/tests/ui_steps.h b/main/midnight/tests/steps/ui_steps.h similarity index 93% rename from main/midnight/tests/ui_steps.h rename to main/midnight/tests/steps/ui_steps.h index e6cac2d9..7e97368b 100644 --- a/main/midnight/tests/ui_steps.h +++ b/main/midnight/tests/steps/ui_steps.h @@ -5,7 +5,7 @@ // Created by Chris Wild on 04/01/2021. // #pragma once -#include "mocks.h" +#include "../mocks/mocks.h" class UIStep { diff --git a/main/midnight/tests/test.cpp b/main/midnight/tests/test.cpp index 520bfb2f..f2cc4629 100644 --- a/main/midnight/tests/test.cpp +++ b/main/midnight/tests/test.cpp @@ -1,7 +1,7 @@ #define CATCH_CONFIG_RUNNER #include "catch2/catch.hpp" -#include "mocks.h" +#include "mocks/mocks.h" #include "../src/cocos.h" diff --git a/main/midnight/tests/moonring_tests.cpp b/main/midnight/tests/tests/moonring_tests.cpp similarity index 100% rename from main/midnight/tests/moonring_tests.cpp rename to main/midnight/tests/tests/moonring_tests.cpp diff --git a/main/midnight/tests/savegame/savegamemapper_tests.cpp b/main/midnight/tests/tests/savegamemapper_tests.cpp similarity index 100% rename from main/midnight/tests/savegame/savegamemapper_tests.cpp rename to main/midnight/tests/tests/savegamemapper_tests.cpp diff --git a/main/midnight/tests/tme_steps.h b/main/midnight/tests/tme_steps.h deleted file mode 100644 index 0a4190b0..00000000 --- a/main/midnight/tests/tme_steps.h +++ /dev/null @@ -1,94 +0,0 @@ -// -// steps.h -// midnight -// -// Created by Chris Wild on 04/01/2021. -// -#pragma once - - -#include "catch2/catch.hpp" -#include "../src/system/moonring.h" -#include "../src/tme/tme_interface.h" -#include "../src/tme/baseinc/tme_internal.h" - -#if defined(_LOM_) - #include "midnight/common_steps.h" -#endif -#if defined(_DDR_) - #include "revenge/common_steps.h" -#endif - -#include - -using namespace tme; -using namespace std; -extern mxengine* mx; - -class TMEStep -{ -public: - static void NewStory(mxdifficulty_t difficulty = DF_NORMAL); - - static void GivenNormalGame() { NewStory(); } - static void GivenHardGame() { NewStory(DF_HARD); } - - static void NightFalls(); - static void CurrentLordIsDead(); - static void SetCurrentLord(LPCSTR name); - static void GameLost(); - static void GameWon(); - - static void LordCarryingObject(LPCSTR name, mxthing_t thing); - static void LordCarryingObject(LPCSTR name, LPCSTR object); - - static void LordAtLocation(LPCSTR name, LPCSTR location); - static void LordAtLocation(LPCSTR name, loc_t location); - static void LordsAtSameLocation(LPCSTR name1, LPCSTR name2); - - static void LordIsNotRecruited(LPCSTR name); - static void LordIsRecruited(LPCSTR name); - static void LordPerformsApproach(LPCSTR name1, LPCSTR name2 = ""); - static void LordsIsLookingAt(LPCSTR name1, LPCSTR name2); - static void LordMovesForward(LPCSTR name); - static void LordIsDead(LPCSTR name); - static void LordKilledByObject(LPCSTR name, LPCSTR killedby); - - // Grouping - static void LordHasFollowers(LPCSTR lord, vector names); - - - // - static bool LordHasBeenRecruited(LPCSTR name); - - // - static constexpr LPCSTR ch_morkin = "CH_MORKIN"; - static constexpr LPCSTR ch_luxor = "CH_LUXOR"; - static constexpr LPCSTR ch_rorthron = "CH_RORTHRON"; -#if defined(_LOM_) - static constexpr LPCSTR ch_shadows = "CH_SHADOWS"; -#endif - - static constexpr LPCSTR ob_wolves = "OB_WOLVES"; -}; - -template T* GetEntity(LPCSTR name) -{ - return static_cast(tme::mx->EntityByName(name)); -} - -inline mxcharacter* GetCharacter(LPCSTR name) -{ - return GetEntity(name); -} - -inline mxstronghold* GetStronghold(LPCSTR name) -{ - return GetEntity(name); -} - -inline mxobject* GetObject(LPCSTR name) -{ - return GetEntity(name); -} -