diff --git a/CInterface/Battling/Battle.cpp b/CInterface/Battling/Battle.cpp index 6ba6225..6daf6a5 100644 --- a/CInterface/Battling/Battle.cpp +++ b/CInterface/Battling/Battle.cpp @@ -84,4 +84,6 @@ export uint8_t CreatureLib_Battle_RegisterEventListener(Battle* p, void (*func)( } export const HistoryHolder* CreatureLib_Battle_GetHistory(Battle* p) { return &p->GetHistory(); } +export uint8_t CreatureLib_Battle_EndBattle(Battle* p) { Try(p->EndBattle()) } + SIMPLE_GET_FUNC(Battle, GetLastTurnTimeMicroseconds, long); \ No newline at end of file diff --git a/src/Battling/Flow/TurnHandler.cpp b/src/Battling/Flow/TurnHandler.cpp index 4287733..644f278 100644 --- a/src/Battling/Flow/TurnHandler.cpp +++ b/src/Battling/Flow/TurnHandler.cpp @@ -6,11 +6,11 @@ using namespace CreatureLib::Battling; -void TurnHandler::RunTurn(ArbUt::BorrowedPtr queue) { +void TurnHandler::RunTurn(ArbUt::BorrowedPtr queue, ArbUt::BorrowedPtr battle) { for (auto choice : queue->GetInnerQueue()) { HOOK(OnBeforeTurn, choice, choice.get()); } - while (queue->HasNext()) { + while (queue->HasNext() && !battle->HasEnded()) { auto item = queue->Dequeue(); EnsureNotNull(item) Ensure(item->GetUser()->GetBattle().HasValue()) diff --git a/src/Battling/Flow/TurnHandler.hpp b/src/Battling/Flow/TurnHandler.hpp index ec90748..442aafb 100644 --- a/src/Battling/Flow/TurnHandler.hpp +++ b/src/Battling/Flow/TurnHandler.hpp @@ -20,7 +20,7 @@ namespace CreatureLib::Battling { static void ExecuteFleeChoice(ArbUt::BorrowedPtr choice); public: - static void RunTurn(ArbUt::BorrowedPtr queue); + static void RunTurn(ArbUt::BorrowedPtr queue, ArbUt::BorrowedPtr battle); }; } diff --git a/src/Battling/Models/Battle.cpp b/src/Battling/Models/Battle.cpp index 55770c4..47cd947 100644 --- a/src/Battling/Models/Battle.cpp +++ b/src/Battling/Models/Battle.cpp @@ -79,7 +79,7 @@ void Battle::CheckChoicesSetAndRun() { this->_currentTurnQueue = std::make_unique(choices); TriggerEventListener(); try { - TurnHandler::RunTurn(this->_currentTurnQueue); + TurnHandler::RunTurn(this->_currentTurnQueue, this); } catch (const ArbUt::Exception& e) { throw e; } catch (const std::exception& e) { @@ -133,7 +133,7 @@ void Battle::ValidateBattleState() { auto side = _sides[i]; if (side->HasFled()) { this->_battleResult = BattleResult::Inconclusive(); - this->_hasEnded = true; + EndBattle(); return; } if (!side->IsDefeated()) { @@ -146,11 +146,11 @@ void Battle::ValidateBattleState() { } if (!survivingSideExists) { this->_battleResult = BattleResult::Inconclusive(); - this->_hasEnded = true; + EndBattle(); return; } this->_battleResult = BattleResult::Conclusive(winningSide); - this->_hasEnded = true; + EndBattle(); } void Battle::AddVolatileScript(const ArbUt::StringView& key) { auto script = _volatile.Get(key); diff --git a/src/Battling/Models/Battle.hpp b/src/Battling/Models/Battle.hpp index a8aed17..f953402 100644 --- a/src/Battling/Models/Battle.hpp +++ b/src/Battling/Models/Battle.hpp @@ -116,6 +116,18 @@ namespace CreatureLib::Battling { const HistoryHolder& GetHistory() const noexcept { return _historyHolder; } long GetLastTurnTimeMicroseconds() const noexcept { return _lastTurnTime; } + + void EndBattle() { + this->_hasEnded = true; + for (size_t i = 0; i < _numberOfSides; i++) { + auto side = _sides[i]; + for (auto c : side->GetCreatures()) { + if (c.HasValue()) { + c.GetValue()->ClearBattleData(); + } + } + } + } }; } diff --git a/src/Battling/Models/Creature.cpp b/src/Battling/Models/Creature.cpp index a0d2f9a..1a63b3c 100644 --- a/src/Battling/Models/Creature.cpp +++ b/src/Battling/Models/Creature.cpp @@ -100,8 +100,10 @@ namespace CreatureLib::Battling { _side = side.GetRaw(); this->ResetActiveScripts(); } - - // region Stat APIs + void Creature::ClearBattleData() noexcept { + _battle = nullptr; + _side = nullptr; + } bool Creature::ChangeStatBoost(Library::Statistic stat, int8_t diffAmount) { bool changed = false; @@ -133,8 +135,6 @@ namespace CreatureLib::Battling { this->_boostedStats.SetStat(stat, s); } - // endregion - const ArbUt::OptionalBorrowedPtr& Creature::GetBattle() const { return _battle; } const ArbUt::OptionalBorrowedPtr& Creature::GetBattleSide() const { return _side; } diff --git a/src/Battling/Models/Creature.hpp b/src/Battling/Models/Creature.hpp index 7730163..d7ff076 100644 --- a/src/Battling/Models/Creature.hpp +++ b/src/Battling/Models/Creature.hpp @@ -105,6 +105,7 @@ namespace CreatureLib::Battling { inline uint32_t GetCurrentHealth() const noexcept { return _currentHealth; } void SetBattleData(const ArbUt::BorrowedPtr& battle, const ArbUt::BorrowedPtr& side); + void ClearBattleData() noexcept; const ArbUt::OptionalBorrowedPtr& GetBattle() const; const ArbUt::OptionalBorrowedPtr& GetBattleSide() const; inline void SetOnBattleField(bool value) { _onBattleField = value; }