Several additional checks to ensure battle does not finish turn when ended.
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Deukhoofd 2020-06-12 16:48:49 +02:00
parent fd1c6e9a0a
commit add77325a4
Signed by: Deukhoofd
GPG Key ID: ADF2E9256009EDCE
2 changed files with 12 additions and 2 deletions

View File

@ -20,12 +20,15 @@ void TurnHandler::RunTurn(ArbUt::BorrowedPtr<ChoiceQueue> queue) {
} }
void TurnHandler::ExecuteChoice(ArbUt::BorrowedPtr<BaseTurnChoice> choice) { void TurnHandler::ExecuteChoice(ArbUt::BorrowedPtr<BaseTurnChoice> choice) {
AssertNotNull(choice); AssertNotNull(choice)
auto choiceKind = choice->GetKind(); auto choiceKind = choice->GetKind();
if (choiceKind == TurnChoiceKind::Pass) { if (choiceKind == TurnChoiceKind::Pass) {
return; return;
} }
auto user = choice->GetUser(); auto user = choice->GetUser();
AssertNotNull(user)
if (user->GetBattle()->HasEnded())
return;
// If the user is fainted, we don't want to execute its choice. // If the user is fainted, we don't want to execute its choice.
if (user->IsFainted()) { if (user->IsFainted()) {
return; return;
@ -100,6 +103,8 @@ void TurnHandler::HandleAttackForTarget(ExecutingAttack* attack, const ArbUt::Bo
auto user = attack->GetUser(); auto user = attack->GetUser();
AssertNotNull(user) AssertNotNull(user)
AssertNotNull(target) AssertNotNull(target)
if (user->GetBattle()->HasEnded())
return;
auto targetSource = target; auto targetSource = target;
auto userSource = attack; auto userSource = attack;
@ -130,6 +135,8 @@ void TurnHandler::HandleAttackForTarget(ExecutingAttack* attack, const ArbUt::Bo
auto& dmgLibrary = library->GetDamageLibrary(); auto& dmgLibrary = library->GetDamageLibrary();
auto hitIterator = attack->GetTargetIteratorBegin(target.GetRaw()); auto hitIterator = attack->GetTargetIteratorBegin(target.GetRaw());
for (uint8_t hitIndex = 0; hitIndex < numberOfHits; hitIndex++) { for (uint8_t hitIndex = 0; hitIndex < numberOfHits; hitIndex++) {
if (user->GetBattle()->HasEnded())
return;
if (user->IsFainted()) { if (user->IsFainted()) {
break; break;
} }
@ -170,7 +177,7 @@ void TurnHandler::HandleAttackForTarget(ExecutingAttack* attack, const ArbUt::Bo
if (damage > 0) { if (damage > 0) {
target->Damage(damage, DamageSource::AttackDamage); target->Damage(damage, DamageSource::AttackDamage);
if (attackData->HasSecondaryEffect()) { if (attackData->HasSecondaryEffect() && !user->IsFainted()) {
bool preventSecondary = false; bool preventSecondary = false;
HOOK(PreventSecondaryEffects, targetSource, attack, target.GetRaw(), hitIndex, &preventSecondary); HOOK(PreventSecondaryEffects, targetSource, attack, target.GetRaw(), hitIndex, &preventSecondary);
if (!preventSecondary) { if (!preventSecondary) {

View File

@ -101,6 +101,9 @@ bool Battle::CanSlotBeFilled(uint8_t side, uint8_t index) const {
} }
void Battle::ValidateBattleState() { void Battle::ValidateBattleState() {
if (_hasEnded) {
return;
}
bool survivingSideExists = false; bool survivingSideExists = false;
uint8_t winningSide = 255; uint8_t winningSide = 255;
for (uint8_t i = 0; i < _sides.Count(); i++) { for (uint8_t i = 0; i < _sides.Count(); i++) {