From 1da65c40517a64a4ef0695b27d3aa3d26ecb2e9f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Thu, 23 Mar 2023 22:33:47 -0300 Subject: [PATCH] Fixed Grassy Terrain not healing --- src/battle_util.c | 32 +++++++++++++++++++++----------- test/terrain_grassy.c | 16 ++++++++++++++++ 2 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 test/terrain_grassy.c diff --git a/src/battle_util.c b/src/battle_util.c index 3e8f94bf69..cfb1d577b5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2127,15 +2127,25 @@ enum ENDTURN_FIELD_COUNT, }; -static bool32 TryEndTerrain(u32 terrainFlag, u32 stringTableId) +static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId) { - if (gFieldStatuses & terrainFlag - && (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.terrainTimer == 0)) + if (gFieldStatuses & terrainFlag) { - gFieldStatuses &= ~terrainFlag; - TryToRevertMimicry(); - gBattleCommunication[MULTISTRING_CHOOSER] = stringTableId; - BattleScriptExecute(BattleScript_TerrainEnds); + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.terrainTimer == 0) + { + gFieldStatuses &= ~terrainFlag; + TryToRevertMimicry(); + + if (terrainFlag != STATUS_FIELD_GRASSY_TERRAIN) + { + gBattleCommunication[MULTISTRING_CHOOSER] = stringTableId; + BattleScriptExecute(BattleScript_TerrainEnds); + } + } + if (terrainFlag == STATUS_FIELD_GRASSY_TERRAIN) + { + BattleScriptExecute(BattleScript_GrassyTerrainHeals); + } return TRUE; } return FALSE; @@ -2492,19 +2502,19 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_ELECTRIC_TERRAIN: - effect = TryEndTerrain(STATUS_FIELD_ELECTRIC_TERRAIN, B_MSG_TERRAINENDS_ELECTRIC); + effect += EndTurnTerrain(STATUS_FIELD_ELECTRIC_TERRAIN, B_MSG_TERRAINENDS_ELECTRIC); gBattleStruct->turnCountersTracker++; break; case ENDTURN_MISTY_TERRAIN: - effect = TryEndTerrain(STATUS_FIELD_MISTY_TERRAIN, B_MSG_TERRAINENDS_MISTY); + effect += EndTurnTerrain(STATUS_FIELD_MISTY_TERRAIN, B_MSG_TERRAINENDS_MISTY); gBattleStruct->turnCountersTracker++; break; case ENDTURN_GRASSY_TERRAIN: - effect = TryEndTerrain(STATUS_FIELD_GRASSY_TERRAIN, B_MSG_TERRAINENDS_GRASS); + effect += EndTurnTerrain(STATUS_FIELD_GRASSY_TERRAIN, B_MSG_TERRAINENDS_GRASS); gBattleStruct->turnCountersTracker++; break; case ENDTURN_PSYCHIC_TERRAIN: - effect = TryEndTerrain(STATUS_FIELD_PSYCHIC_TERRAIN, B_MSG_TERRAINENDS_PSYCHIC); + effect += EndTurnTerrain(STATUS_FIELD_PSYCHIC_TERRAIN, B_MSG_TERRAINENDS_PSYCHIC); gBattleStruct->turnCountersTracker++; break; case ENDTURN_WATER_SPORT: diff --git a/test/terrain_grassy.c b/test/terrain_grassy.c new file mode 100644 index 0000000000..6b3a93234e --- /dev/null +++ b/test/terrain_grassy.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "test_battle.h" + +SINGLE_BATTLE_TEST("Grassy Terrain recovers 1/16th HP at end of turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + MESSAGE("Wobbuffet is healed by the grassy terrain!"); + HP_BAR(player, damage: -maxHP / 16); + } +}