Belch AI Scoring Fix (#4616)

* Belch scoring fix and test

* Add assumptions for pocket

* Update test to AI_SINGLE_BATTLE_TEST

* Alex's fixes

* Missed reverting a line

* Mucked up spacing mb

* Mucked up the spacing fix mb MB
This commit is contained in:
Pawkkie 2024-05-26 16:23:04 -04:00 committed by GitHub
parent 2e07dbb0ee
commit c279aa23c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 57 additions and 28 deletions

View file

@ -202,6 +202,7 @@ u8 GetBattleMoveCategory(u32 moveId);
bool32 CanFling(u32 battler);
bool32 IsTelekinesisBannedSpecies(u16 species);
bool32 IsHealBlockPreventingMove(u32 battler, u32 move);
bool32 IsBelchPreventingMove(u32 battler, u32 move);
bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId);
bool32 IsPartnerMonFromSameTrainer(u32 battler);
u8 GetCategoryBasedOnStats(u32 battler);

View file

@ -426,7 +426,7 @@ bool32 IsDamageMoveUnusable(u32 move, u32 battlerAtk, u32 battlerDef)
return TRUE;
break;
case EFFECT_BELCH:
if (ItemId_GetPocket(GetUsedHeldItem(battlerAtk)) != POCKET_BERRIES)
if (IsBelchPreventingMove(battlerAtk, move))
return TRUE;
break;
case EFFECT_LAST_RESORT:

View file

@ -2189,6 +2189,7 @@ static void Cmd_multihitresultmessage(void)
if (gSpecialStatuses[gBattlerTarget].berryReduced
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[gBattlerTarget]];
gSpecialStatuses[gBattlerTarget].berryReduced = FALSE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString;
@ -2649,6 +2650,7 @@ static void Cmd_resultmessage(void)
if (gSpecialStatuses[gBattlerTarget].berryReduced
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[gBattlerTarget]];
gSpecialStatuses[gBattlerTarget].berryReduced = FALSE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString;

View file

@ -1262,7 +1262,7 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move)
return gMovesInfo[move].healingMove;
}
static bool32 IsBelchPreventingMove(u32 battler, u32 move)
bool32 IsBelchPreventingMove(u32 battler, u32 move)
{
if (gMovesInfo[move].effect != EFFECT_BELCH)
return FALSE;

View file

@ -0,0 +1,52 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_BELCH].effect == EFFECT_BELCH);
ASSUME(gMovesInfo[MOVE_MUD_SHOT].type == TYPE_GROUND);
ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].holdEffect == HOLD_EFFECT_RESIST_BERRY);
ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].holdEffectParam == TYPE_GROUND);
ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].pocket == POCKET_BERRIES);
ASSUME(gItemsInfo[ITEM_ORAN_BERRY].pocket == POCKET_BERRIES);
}
AI_SINGLE_BATTLE_TEST("AI: Belch has nonzero score after eating a berry")
{
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_BAYLEEF) { Level(18); Moves(MOVE_MUD_SHOT, MOVE_TACKLE); }
OPPONENT(SPECIES_PIKACHU) { Level(15); Item(ITEM_SHUCA_BERRY); Moves(MOVE_BELCH, MOVE_TACKLE); }
} WHEN {
TURN { MOVE(player, MOVE_MUD_SHOT); EXPECT_MOVE(opponent, MOVE_TACKLE); }
TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_BELCH);}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BELCH, opponent);
}
}
SINGLE_BATTLE_TEST("Belch cannot be used if the user has not eaten a berry")
{
u16 item = 0;
PARAMETRIZE { item = ITEM_NONE; }
PARAMETRIZE { item = ITEM_ORAN_BERRY; }
GIVEN {
PLAYER(SPECIES_SKWOVET) { Item(item); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
if (item == ITEM_NONE)
TURN { MOVE(player, MOVE_BELCH, allowed: FALSE); MOVE(player, MOVE_CELEBRATE); }
else {
TURN { MOVE(player, MOVE_STUFF_CHEEKS); }
TURN { MOVE(player, MOVE_BELCH); }
}
} SCENE {
if (item == ITEM_NONE) {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
}
else {
ANIMATION(ANIM_TYPE_MOVE, MOVE_STUFF_CHEEKS, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_BELCH, player);
}
}
}

View file

@ -103,29 +103,3 @@ SINGLE_BATTLE_TEST("Stuff Cheeks fails if the user's berry is removed before the
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Belch cannot be used if the user has not eaten a berry")
{
u16 item = 0;
PARAMETRIZE { item = ITEM_NONE; }
PARAMETRIZE { item = ITEM_ORAN_BERRY; }
GIVEN {
PLAYER(SPECIES_SKWOVET) { Item(item); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
if (item == ITEM_NONE)
TURN { MOVE(player, MOVE_BELCH, allowed: FALSE); MOVE(player, MOVE_CELEBRATE); }
else {
TURN { MOVE(player, MOVE_STUFF_CHEEKS); }
TURN { MOVE(player, MOVE_BELCH); }
}
} SCENE {
if (item == ITEM_NONE) {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
}
else {
ANIMATION(ANIM_TYPE_MOVE, MOVE_STUFF_CHEEKS, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_BELCH, player);
}
}
}