From 881d924cf38dcb8debf8bb5f7e037922db672d63 Mon Sep 17 00:00:00 2001 From: Hedara Date: Tue, 1 Apr 2025 10:38:12 +0200 Subject: [PATCH] Fix using items to heal partner in battle --- src/battle_script_commands.c | 2 +- test/battle/item_effect/restore_hp.c | 158 ++++++++++++++++++++++++++- 2 files changed, 158 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 34e78a3890..9e74b65391 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17168,7 +17168,7 @@ void BS_ItemRestoreHP(void) // Heal is applied as move damage if battler is active. if (battler != MAX_BATTLERS_COUNT && hp != 0) { - gBattleStruct->moveDamage[gBattlerAttacker] = -healAmount; + gBattleStruct->moveDamage[battler] = -healAmount; gBattlescriptCurrInstr = cmd->restoreBattlerInstr; } else diff --git a/test/battle/item_effect/restore_hp.c b/test/battle/item_effect/restore_hp.c index eecbfbd29c..286b91ccfc 100644 --- a/test/battle/item_effect/restore_hp.c +++ b/test/battle/item_effect/restore_hp.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Items can restore a battler's HP by a fixed amount") +SINGLE_BATTLE_TEST("Items can restore a battler's HP by a fixed amount (singles, player)") { u32 item, hp; PARAMETRIZE { item = ITEM_POTION; hp = 20; } @@ -29,6 +29,162 @@ SINGLE_BATTLE_TEST("Items can restore a battler's HP by a fixed amount") } } +SINGLE_BATTLE_TEST("Items can restore a battler's HP by a fixed amount (singles, opponent)") +{ + u32 item, hp; + PARAMETRIZE { item = ITEM_POTION; hp = 20; } + PARAMETRIZE { item = ITEM_SUPER_POTION; hp = I_HEALTH_RECOVERY >= GEN_7 ? 60 : 50; } + PARAMETRIZE { item = ITEM_HYPER_POTION; hp = I_HEALTH_RECOVERY >= GEN_7 ? 120 : 200; } + PARAMETRIZE { item = ITEM_FRESH_WATER; hp = I_HEALTH_RECOVERY >= GEN_7 ? 30 : 50; } + PARAMETRIZE { item = ITEM_SODA_POP; hp = I_HEALTH_RECOVERY >= GEN_7 ? 50 : 60; } + PARAMETRIZE { item = ITEM_LEMONADE; hp = I_HEALTH_RECOVERY >= GEN_7 ? 70 : 80; } + PARAMETRIZE { item = ITEM_MOOMOO_MILK; hp = 100; } + PARAMETRIZE { item = ITEM_ENERGY_POWDER; hp = I_HEALTH_RECOVERY >= GEN_7 ? 60 : 50; } + PARAMETRIZE { item = ITEM_ENERGY_ROOT; hp = I_HEALTH_RECOVERY >= GEN_7 ? 120 : 200; } + PARAMETRIZE { item = ITEM_SWEET_HEART; hp = 20; } + PARAMETRIZE { item = ITEM_ORAN_BERRY; hp = 10; } +#if I_SITRUS_BERRY_HEAL < GEN_4 + PARAMETRIZE { item = ITEM_SITRUS_BERRY; hp = 30; } +#endif + GIVEN { + ASSUME(gItemsInfo[item].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + } WHEN { + TURN { USE_ITEM(opponent, item, partyIndex: 0); } + } SCENE { + HP_BAR(opponent, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a battler's HP (doubles, playerLeft)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(playerLeft, ITEM_POTION, partyIndex: 0); } + } SCENE { + HP_BAR(playerLeft, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a battler's HP (doubles, playerRight)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(playerRight, ITEM_POTION, partyIndex: 1); } + } SCENE { + HP_BAR(playerRight, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a battler's HP (doubles, opponentLeft)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(opponentLeft, ITEM_POTION, partyIndex: 0); } + } SCENE { + HP_BAR(opponentLeft, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a battler's HP (doubles, opponentRight)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + } WHEN { + TURN { USE_ITEM(opponentRight, ITEM_POTION, partyIndex: 1); } + } SCENE { + HP_BAR(opponentRight, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a partner battler's HP (playerRight to playerLeft)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(playerRight, ITEM_POTION, partyIndex: 0); } + } SCENE { + HP_BAR(playerLeft, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a partner battler's HP (playerLeft to playerRight)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(playerLeft, ITEM_POTION, partyIndex: 1); } + } SCENE { + HP_BAR(playerRight, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a partner battler's HP (opponentRight to opponentLeft)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(opponentRight, ITEM_POTION, partyIndex: 0); } + } SCENE { + HP_BAR(opponentLeft, damage: -hp); + } +} + +DOUBLE_BATTLE_TEST("Items can restore a partner battler's HP (opponentLeft to opponentRight)") +{ + s32 hp = gItemsInfo[ITEM_POTION].holdEffectParam; + GIVEN { + ASSUME(gItemsInfo[ITEM_POTION].battleUsage == EFFECT_ITEM_RESTORE_HP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } + } WHEN { + TURN { USE_ITEM(opponentLeft, ITEM_POTION, partyIndex: 1); } + } SCENE { + HP_BAR(opponentRight, damage: -hp); + } +} + SINGLE_BATTLE_TEST("Items can restore a battler's HP by a percentage") { u32 item, percentage;