Supports cloning battles for AI purposes.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2021-04-11 16:27:21 +02:00
parent 14016837d9
commit a88719e2b3
8 changed files with 129 additions and 6 deletions

View File

@@ -14,3 +14,48 @@ void PkmnLib::Battling::Battle::ClearWeather() {
_weatherScript = nullptr;
_eventHook.Trigger<WeatherChangeEvent>(""_cnc);
}
PkmnLib::Battling::Battle* PkmnLib::Battling::Battle::Clone() const {
auto parties = ArbUt::List<CreatureLib::Battling::BattleParty*>(_parties.Count());
for (auto* party : _parties) {
parties.Append(party->Clone());
}
auto* battle =
new Battle(_library.ForceAs<const BattleLibrary>(), parties, _canFlee, _numberOfSides, _creaturesPerSide);
for (int i = 0; i < _numberOfSides; ++i) {
battle->_sides.Set(i, _sides[i]->CloneWithoutCreatures());
// 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 != -1U) {
auto c = battle->_parties.At(j)->GetParty()->GetParty()[partyIndex];
battle->_sides.At(i)->SetCreature(c, creatureIndex);
j = _parties.Count();
break;
}
}
}
}
battle->_random = _random;
battle->_hasEnded = _hasEnded;
battle->_battleResult = _battleResult;
_historyHolder.CloneOnto(battle->_historyHolder);
battle->_currentTurn = _currentTurn;
_volatile.Clone(battle->_volatile);
if (_weatherScript != nullptr) {
battle->_weatherScript = std::unique_ptr<CreatureLib::Battling::BattleScript>(_weatherScript->Clone());
}
return battle;
}

View File

@@ -36,6 +36,8 @@ namespace PkmnLib::Battling {
scripts.Append(CreatureLib::Battling::ScriptWrapper(
CreatureLib::Battling::ScriptWrapper::FromScript(&_weatherScript)));
}
Battle* Clone() const override;
};
}