#include "Battle.hpp" #include "../PkmnScriptHook.hpp" bool PkmnLib::Battling::Battle::SetWeather(const ArbUt::StringView& name) { bool blockWeather = false; PKMN_HOOK(BlockWeather, this, this, &blockWeather); if (blockWeather) { return false; } if (_weatherScript.HasValue()) { _weatherScript.GetValue()->OnRemove(); } _weatherScript = _library->LoadScript(this, static_cast(PkmnScriptCategory::Weather), name).TakeOwnership(); _eventHook.Trigger(name); return true; } void PkmnLib::Battling::Battle::ClearWeather() { if (!_weatherScript.HasValue()) return; _weatherScript.GetValue()->OnRemove(); _weatherScript = nullptr; _eventHook.Trigger(""_cnc); } PkmnLib::Battling::Battle* PkmnLib::Battling::Battle::Clone() const { auto parties = ArbUt::List(_parties.Count()); for (auto* party : _parties) { auto* partyClone = party->Clone(); parties.Append(partyClone); for (auto* m : partyClone->GetParty()->GetParty()) { if (m != nullptr) { m->ClearBattleData(); } } } auto* battle = new Battle(_library.ForceAs(), parties, _canFlee, _numberOfSides, _creaturesPerSide); for (int i = 0; i < _numberOfSides; ++i) { battle->_sides.Set(i, _sides[i]->CloneWithoutCreatures(battle)); // FIXME: This is horrible code to translate the creature from the old battle into the same creature in the // new battle. This needs to be cleaned up, as it's ugly and slow. for (int creatureIndex = 0; creatureIndex < _creaturesPerSide; ++creatureIndex) { auto creature = _sides[i]->GetCreature(creatureIndex); if (!creature.HasValue()) { continue; } for (size_t j = 0; j < _parties.Count(); ++j) { auto party = _parties[j]; if (!party->IsResponsibleForIndex(i, creatureIndex)) { continue; } auto partyIndex = party->GetParty()->GetParty().IndexOf(creature.GetValue()); if (partyIndex.has_value()) { auto c = battle->_parties.At(j)->GetParty()->GetParty()[partyIndex.value()]; battle->_sides.At(i)->SetCreature(c, creatureIndex); j = _parties.Count(); break; } } } } battle->_random = _random; battle->_hasEnded = _hasEnded; battle->_battleResult = _battleResult; battle->_currentTurn = _currentTurn; _volatile.Clone(battle, battle->_volatile); if (_weatherScript.HasValue()) { battle->_weatherScript = _weatherScript.GetValue()->Clone(battle); } return battle; }