diff --git a/src/Battling/Models/Battle.hpp b/src/Battling/Models/Battle.hpp index 5fd7ac1..707e397 100644 --- a/src/Battling/Models/Battle.hpp +++ b/src/Battling/Models/Battle.hpp @@ -64,6 +64,8 @@ namespace CreatureLib::Battling { void ValidateBattleState(); inline bool HasEnded() const { return _hasEnded; } inline uint8_t GetResult() const { return _battleResult; } + + const std::vector& GetSides() const { return _sides; } }; } diff --git a/src/Battling/Models/BattleSide.cpp b/src/Battling/Models/BattleSide.cpp index b983acf..d9a5aea 100644 --- a/src/Battling/Models/BattleSide.cpp +++ b/src/Battling/Models/BattleSide.cpp @@ -38,12 +38,24 @@ void BattleSide::SetChoice(BaseTurnChoice* choice) { void BattleSide::SetCreature(Creature* creature, uint8_t index) { auto old = _creatures[index]; - if (old != nullptr){ + if (old != nullptr) { old->SetOnBattleField(false); } _creatures[index] = creature; creature->SetBattleData(_battle, this); creature->SetOnBattleField(true); + if (_battle == nullptr) + return; + for (auto side : _battle->GetSides()) { + if (side == this) + continue; + for (auto c : side->GetCreatures()) { + if (c != nullptr) { + c->MarkOpponentAsSeen(creature); + creature->MarkOpponentAsSeen(c); + } + } + } } bool BattleSide::CreatureOnSide(const Creature* creature) const { diff --git a/src/Battling/Models/BattleSide.hpp b/src/Battling/Models/BattleSide.hpp index 1f4b27a..7b58803 100644 --- a/src/Battling/Models/BattleSide.hpp +++ b/src/Battling/Models/BattleSide.hpp @@ -47,6 +47,8 @@ namespace CreatureLib::Battling { void GetActiveScripts(std::vector& scripts) final; + const std::vector& GetCreatures() { return _creatures; } + uint8_t GetSideIndex() { return _index; } uint8_t GetCreatureIndex(Creature* c) { for (size_t i = 0; i < _creatures.size(); i++) { diff --git a/src/Battling/Models/Creature.hpp b/src/Battling/Models/Creature.hpp index 7f0b751..c48b036 100644 --- a/src/Battling/Models/Creature.hpp +++ b/src/Battling/Models/Creature.hpp @@ -47,6 +47,7 @@ namespace CreatureLib::Battling { bool _hasOverridenTalent; std::string _overridenTalentName = ""; + std::unordered_set _seenOpponents = {}; std::vector _attacks; @@ -69,7 +70,7 @@ namespace CreatureLib::Battling { void SetBattleData(Battle* battle, BattleSide* side); Battle* GetBattle() const; BattleSide* GetBattleSide() const; - void SetOnBattleField(bool value) {_onBattleField = value;} + void SetOnBattleField(bool value) { _onBattleField = value; } bool IsOnBattleField() const { return _onBattleField; } const std::string& GetNickname() const; @@ -83,6 +84,9 @@ namespace CreatureLib::Battling { void Damage(uint32_t damage, DamageSource source); void OverrideActiveTalent(const std::string& talent); + void MarkOpponentAsSeen(Creature* creature) { _seenOpponents.insert(creature); } + const std::unordered_set& GetSeenOpponents() const { return _seenOpponents; } + void GetActiveScripts(std::vector& scripts) override; void ClearVolatileScripts(); diff --git a/tests/Integration/BattleIntegrations.cpp b/tests/Integration/BattleIntegrations.cpp index dc4a508..b66cc29 100644 --- a/tests/Integration/BattleIntegrations.cpp +++ b/tests/Integration/BattleIntegrations.cpp @@ -185,4 +185,40 @@ TEST_CASE("Switch Creature in, but have attack aimed at it. Attack should hit ne REQUIRE(c1->GetCurrentHealth() == c1->GetBoostedStat(Core::Statistic::Health)); } +TEST_CASE("Switch Creature in, mark as seen opponent for opponent", "[Integrations]") { + auto library = TestLibrary::Get(); + auto c1 = CreateCreature(library, "testSpecies1", 100).WithAttack("standard", AttackLearnMethod::Unknown)->Create(); + auto c2 = CreateCreature(library, "testSpecies1", 1).WithAttack("standard", AttackLearnMethod::Unknown)->Create(); + CreatureParty party1{c1, c2}; + auto battleParty1 = BattleParty(&party1, {CreatureIndex(0, 0)}); + auto c3 = CreateCreature(library, "testSpecies1", 1).WithAttack("standard", AttackLearnMethod::Unknown)->Create(); + CreatureParty party2{c3}; + auto battleParty2 = BattleParty(&party2, {CreatureIndex(1, 0)}); + + auto battle = Battle(library, {battleParty1, battleParty2}); + + battle.SwitchCreature(0, 0, c1); + battle.SwitchCreature(1, 0, c3); + + auto seen = c3->GetSeenOpponents(); + REQUIRE(seen.size() == 1); + REQUIRE(seen.find(c1) != seen.end()); + + battle.TrySetChoice(new SwitchTurnChoice(c1, c2)); + battle.TrySetChoice(new PassTurnChoice(c3)); + + seen = c3->GetSeenOpponents(); + REQUIRE(seen.size() == 2); + REQUIRE(seen.find(c1) != seen.end()); + REQUIRE(seen.find(c2) != seen.end()); + + battle.TrySetChoice(new SwitchTurnChoice(c2, c1)); + battle.TrySetChoice(new PassTurnChoice(c3)); + + seen = c3->GetSeenOpponents(); + REQUIRE(seen.size() == 2); + REQUIRE(seen.find(c1) != seen.end()); + REQUIRE(seen.find(c2) != seen.end()); +} + #endif \ No newline at end of file