From cc4a9b9f4b5ea742cccab1dc5d889d6a9956a7ed Mon Sep 17 00:00:00 2001 From: Ct11217 Date: Thu, 15 Sep 2022 22:57:29 -0600 Subject: [PATCH 001/111] Recommit to Dev branch --- include/battle_ai_switch_items.h | 2 +- src/battle_ai_main.c | 4 +- src/battle_ai_switch_items.c | 168 +++++++++++++++---------- src/battle_controller_opponent.c | 5 +- src/battle_controller_player_partner.c | 2 +- 5 files changed, 109 insertions(+), 72 deletions(-) diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index 70dc41b34..77d1e6315 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -33,7 +33,7 @@ enum { void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(void); -u8 GetMostSuitableMonToSwitchInto(void); +u8 GetMostSuitableMonToSwitchInto(bool8); bool32 ShouldSwitch(void); #endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 312ff853c..7bc4edae6 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -356,7 +356,7 @@ static u8 ChooseMoveOrAction_Singles(void) break; } - if (i == MAX_MON_MOVES && GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + if (i == MAX_MON_MOVES && GetMostSuitableMonToSwitchInto(TRUE) != PARTY_SIZE) { AI_THINKING_STRUCT->switchMon = TRUE; return AI_CHOICE_SWITCH; @@ -370,7 +370,7 @@ static u8 ChooseMoveOrAction_Singles(void) && gDisableStructs[sBattler_AI].truantCounter && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2) { - if (GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + if (GetMostSuitableMonToSwitchInto(TRUE) != PARTY_SIZE) { AI_THINKING_STRUCT->switchMon = TRUE; return AI_CHOICE_SWITCH; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 4948113a2..f8e60ee7e 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -26,6 +26,7 @@ static bool8 ShouldUseItem(void); static bool32 AiExpectsToFaintPlayer(void); static bool32 AI_ShouldHeal(u32 healAmount); static bool32 AI_OpponentCanFaintAiWithMod(u32 healAmount); +static bool32 AI_CheckSurvivabilty(bool8 checkSurvivability, int playerPokemon, int aiPokemon); void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId) { @@ -414,12 +415,12 @@ static bool8 ShouldSwitchIfAbilityBenefit(void) moduloChance = 4; //25% //Attempt to cure bad ailment if (gBattleMons[gActiveBattler].status1 & (STATUS1_SLEEP | STATUS1_FREEZE | STATUS1_TOXIC_POISON) - && GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + && GetMostSuitableMonToSwitchInto(TRUE) != PARTY_SIZE) break; //Attempt to cure lesser ailment if ((gBattleMons[gActiveBattler].status1 & STATUS1_ANY) && (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 2) - && GetMostSuitableMonToSwitchInto() != PARTY_SIZE + && GetMostSuitableMonToSwitchInto(TRUE) != PARTY_SIZE && Random() % (moduloChance*chanceReducer) == 0) break; @@ -431,7 +432,7 @@ static bool8 ShouldSwitchIfAbilityBenefit(void) if (gBattleMons[gActiveBattler].status1 & STATUS1_ANY) return FALSE; if ((gBattleMons[gActiveBattler].hp <= ((gBattleMons[gActiveBattler].maxHP * 2) / 3)) - && GetMostSuitableMonToSwitchInto() != PARTY_SIZE + && GetMostSuitableMonToSwitchInto(TRUE) != PARTY_SIZE && Random() % (moduloChance*chanceReducer) == 0) break; @@ -726,7 +727,7 @@ void AI_TrySwitchOrUseItem(void) { if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == PARTY_SIZE) { - s32 monToSwitchId = GetMostSuitableMonToSwitchInto(); + s32 monToSwitchId = GetMostSuitableMonToSwitchInto(TRUE); if (monToSwitchId == PARTY_SIZE) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) @@ -746,6 +747,8 @@ void AI_TrySwitchOrUseItem(void) { if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0) continue; + if (GetMonData(&party[monToSwitchId], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; if (monToSwitchId == gBattlerPartyIndexes[battlerIn1]) continue; if (monToSwitchId == gBattlerPartyIndexes[battlerIn2]) @@ -779,7 +782,7 @@ void AI_TrySwitchOrUseItem(void) // If there are two(or more) mons to choose from, always choose one that has baton pass // as most often it can't do much on its own. -static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, int aliveCount) +static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, int aliveCount, bool8 checkSurvivability) { int i, j, bits = 0; @@ -788,6 +791,9 @@ static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u if (invalidMons & gBitTable[i]) continue; + if (AI_CheckSurvivabilty(checkSurvivability, BATTLE_OPPOSITE(gActiveBattler), i)) + continue; + for (j = 0; j < MAX_MON_MOVES; j++) { if (GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL) == MOVE_BATON_PASS) @@ -810,69 +816,71 @@ static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u return PARTY_SIZE; } -static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 opposingBattler) +static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 opposingBattler, bool8 checkSurvivability) { - int i, bits = 0; - - while (bits != 0x3F) // All mons were checked. + int i, j = 0; + u32 bestResist = UQ_4_12(1.0); + int bestMonId = PARTY_SIZE; + // Find the mon whose type is the most suitable defensively. + for (i = firstId; i < lastId; i++) { - u32 bestResist = UQ_4_12(1.0); - int bestMonId = PARTY_SIZE; - // Find the mon whose type is the most suitable defensively. - for (i = firstId; i < lastId; i++) + u16 species = GetMonData(&party[i], MON_DATA_SPECIES); + u32 typeEffectiveness = UQ_4_12(1.0); + + u8 atkType1 = gBattleMons[opposingBattler].type1; + u8 atkType2 = gBattleMons[opposingBattler].type2; + u8 defType1 = gBaseStats[species].type1; + u8 defType2 = gBaseStats[species].type2; + + if (gBitTable[i] & invalidMons) + continue; + if (AI_CheckSurvivabilty(checkSurvivability, BATTLE_OPPOSITE(gActiveBattler), i)) + continue; + + typeEffectiveness *= GetTypeModifier(atkType1, defType1); + if (atkType2 != atkType1) + typeEffectiveness *= GetTypeModifier(atkType2, defType1); + if (defType2 != defType1) { - if (!(gBitTable[i] & invalidMons) && !(gBitTable[i] & bits)) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - u32 typeEffectiveness = UQ_4_12(1.0); - - u8 atkType1 = gBattleMons[opposingBattler].type1; - u8 atkType2 = gBattleMons[opposingBattler].type2; - u8 defType1 = gBaseStats[species].type1; - u8 defType2 = gBaseStats[species].type2; - - typeEffectiveness *= GetTypeModifier(atkType1, defType1); - if (atkType2 != atkType1) - typeEffectiveness *= GetTypeModifier(atkType2, defType1); - if (defType2 != defType1) - { - typeEffectiveness *= GetTypeModifier(atkType1, defType2); - if (atkType2 != atkType1) - typeEffectiveness *= GetTypeModifier(atkType2, defType2); - } - if (typeEffectiveness < bestResist) - { - bestResist = typeEffectiveness; - bestMonId = i; - } - } + typeEffectiveness *= GetTypeModifier(atkType1, defType2); + if (atkType2 != atkType1) + typeEffectiveness *= GetTypeModifier(atkType2, defType2); } - - // Ok, we know the mon has the right typing but does it have at least one super effective move? - if (bestMonId != PARTY_SIZE) + if ((typeEffectiveness < bestResist) + || ((typeEffectiveness <= bestResist) && !checkSurvivability)) //Fine with a nuetral matchup on second time through { - for (i = 0; i < MAX_MON_MOVES; i++) - { - u32 move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0)) - break; - } - - if (i != MAX_MON_MOVES) - return bestMonId; // Has both the typing and at least one super effective move. - - bits |= gBitTable[bestMonId]; // Sorry buddy, we want something better. - } - else - { - bits = 0x3F; // No viable mon to switch. + bestResist = typeEffectiveness; + bestMonId = i; } } - return PARTY_SIZE; + // Ok, we don't have anything that type resists. But do we at least have something with a super effective move? + if (bestMonId == PARTY_SIZE) + { + // Find the mon that has an attack most suited offensively + for (i = firstId; i < lastId; i++) + { + if (gBitTable[i] & invalidMons) + continue; + if (AI_CheckSurvivabilty(checkSurvivability, BATTLE_OPPOSITE(gActiveBattler), i)) + continue; + + for (j = 0; j < MAX_MON_MOVES; j++) + { + u32 move = GetMonData(&party[i], MON_DATA_MOVE1 + j); + if (move != MOVE_NONE && AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0)) + { + bestMonId = i; // Has at least one super effective move. + break; + } + } + } + } + + return bestMonId; } -static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 opposingBattler) +static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 opposingBattler, bool8 checkSurvivability) { int i, j; int bestDmg = 0; @@ -884,6 +892,8 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva { if (gBitTable[i] & invalidMons) continue; + if (AI_CheckSurvivabilty(checkSurvivability, BATTLE_OPPOSITE(gActiveBattler), i)) + continue; for (j = 0; j < MAX_MON_MOVES; j++) { @@ -903,10 +913,10 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva return bestMonId; } -u8 GetMostSuitableMonToSwitchInto(void) +u8 GetMostSuitableMonToSwitchInto(bool8 checkSurvivability) { u32 opposingBattler = 0; - u32 bestMonId = 0; + u32 bestMonId = PARTY_SIZE; u8 battlerIn1 = 0, battlerIn2 = 0; s32 firstId = 0; s32 lastId = 0; // + 1 @@ -948,7 +958,7 @@ u8 GetMostSuitableMonToSwitchInto(void) // Get invalid slots ids. for (i = firstId; i < lastId; i++) { - if (GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_NONE + if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE || GetMonData(&party[i], MON_DATA_HP) == 0 || gBattlerPartyIndexes[battlerIn1] == i || gBattlerPartyIndexes[battlerIn2] == i @@ -962,19 +972,26 @@ u8 GetMostSuitableMonToSwitchInto(void) aliveCount++; } - bestMonId = GetBestMonBatonPass(party, firstId, lastId, invalidMons, aliveCount); + bestMonId = GetBestMonBatonPass(party, firstId, lastId, invalidMons, aliveCount, checkSurvivability); if (bestMonId != PARTY_SIZE) return bestMonId; - bestMonId = GetBestMonTypeMatchup(party, firstId, lastId, invalidMons, opposingBattler); + bestMonId = GetBestMonTypeMatchup(party, firstId, lastId, invalidMons, opposingBattler, checkSurvivability); if (bestMonId != PARTY_SIZE) return bestMonId; - bestMonId = GetBestMonDmg(party, firstId, lastId, invalidMons, opposingBattler); + bestMonId = GetBestMonDmg(party, firstId, lastId, invalidMons, opposingBattler, checkSurvivability); if (bestMonId != PARTY_SIZE) return bestMonId; - return PARTY_SIZE; + //Didn't find any good options first time around. Try again without checking survivabilty, better than a random mon + if (checkSurvivability && bestMonId == PARTY_SIZE) + { + bestMonId = GetMostSuitableMonToSwitchInto(FALSE); + return bestMonId; + } + + return bestMonId; } static u8 GetAI_ItemType(u16 itemId, const u8 *itemEffect) @@ -1178,3 +1195,24 @@ static bool32 AI_OpponentCanFaintAiWithMod(u32 healAmount) } return FALSE; } + +static bool32 AI_CheckSurvivabilty(bool8 checkSurvivability, int playerPokemon, int aiPokemon) +{ + if (!checkSurvivability) + return FALSE; + + if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING) + { + //Opponent can OHKO AI, don't send this Pokemon out + if (CanTargetFaintAiWithMod(playerPokemon, aiPokemon, 0, 0)) + return TRUE; + + //Opponent can 2HKO AI and AI cannot strike first + //ToDo: Modify for switches when AI has already attacked (Volt Switch etc.) + if (CanTargetFaintAiWithMod(playerPokemon, aiPokemon, 0, 2) + && GetWhoStrikesFirst(playerPokemon, aiPokemon, TRUE) == 0) //Player strikes first + return TRUE; + } + + return FALSE; +} \ No newline at end of file diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index c32d0cd58..8e95e3bb9 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1676,8 +1676,7 @@ static void OpponentHandleChoosePokemon(void) if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == PARTY_SIZE) { - chosenMonId = GetMostSuitableMonToSwitchInto(); - + chosenMonId = GetMostSuitableMonToSwitchInto(TRUE); if (chosenMonId == PARTY_SIZE) { s32 battler1, battler2, firstId, lastId; @@ -1691,7 +1690,6 @@ static void OpponentHandleChoosePokemon(void) battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); pokemonInBattle = 2; - } GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); @@ -1699,6 +1697,7 @@ static void OpponentHandleChoosePokemon(void) for (chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) { if (GetMonData(&gEnemyParty[chosenMonId], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[chosenMonId], MON_DATA_SPECIES2) != SPECIES_NONE && chosenMonId != gBattlerPartyIndexes[battler1] && chosenMonId != gBattlerPartyIndexes[battler2] && (AI_THINKING_STRUCT->aiFlags & AI_FLAG_ACE_POKEMON diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index d39d745a6..8af44377d 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -1548,7 +1548,7 @@ static void PlayerPartnerHandleChooseItem(void) static void PlayerPartnerHandleChoosePokemon(void) { - s32 chosenMonId = GetMostSuitableMonToSwitchInto(); + s32 chosenMonId = GetMostSuitableMonToSwitchInto(TRUE); if (chosenMonId == 6) // just switch to the next mon { From 36c1c4dc11cb767a117ab34751cbb6d336bb379f Mon Sep 17 00:00:00 2001 From: Porygon23 <59948117+Porygon23@users.noreply.github.com> Date: Fri, 16 Sep 2022 08:21:13 -0600 Subject: [PATCH 002/111] Update include/battle_ai_switch_items.h Co-authored-by: Eduardo Quezada D'Ottone --- include/battle_ai_switch_items.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index 77d1e6315..58b65396a 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -33,7 +33,7 @@ enum { void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(void); -u8 GetMostSuitableMonToSwitchInto(bool8); +u8 GetMostSuitableMonToSwitchInto(bool8 checkSurvivability); bool32 ShouldSwitch(void); #endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H From c5c0e91215e05dcc8d517f9780f4d54afa1a7d52 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 2 Feb 2023 21:39:01 -0500 Subject: [PATCH 003/111] fix BattleScript_TargetAbilityStatRaiseRet overwriting gBattlerAttacker --- data/battle_scripts_1.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9ff5838b1..e526f6e96 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -10200,6 +10200,7 @@ BattleScript_SymbiosisActivates:: return BattleScript_TargetAbilityStatRaiseRet:: + copybyte sSAVED_BATTLER, gBattlerAttacker copybyte gBattlerAbility, gEffectBattler copybyte gBattlerAttacker, gBattlerTarget call BattleScript_AbilityPopUp @@ -10207,6 +10208,7 @@ BattleScript_TargetAbilityStatRaiseRet:: setgraphicalstatchangevalues call BattleScript_StatUp BattleScript_TargetAbilityStatRaiseRet_End: + copybyte gBattlerAttacker, sSAVED_BATTLER return BattleScript_PokemonCantUseTheMove:: From f060d0185f2da05378f51c577baadbf3fb131cef Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 2 Feb 2023 21:59:40 -0500 Subject: [PATCH 004/111] fix wind power, electromorphosis stomping on gbattlerattacker --- data/battle_scripts_1.s | 33 +++------------------------------ src/battle_script_commands.c | 9 +++++---- 2 files changed, 8 insertions(+), 34 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e526f6e96..0dada5566 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2951,12 +2951,9 @@ BattleScript_TryTailwindAbilitiesLoop_WindRider: BattleScript_TryTailwindAbilitiesLoop_WindPower: call BattleScript_AbilityPopUp - copybyte sSAVED_BATTLER, gBattlerAttacker - copybyte gBattlerAttacker, gBattlerTarget - setcharge + setcharge BS_TARGET printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG - copybyte gBattlerAttacker, sSAVED_BATTLER goto BattleScript_TryTailwindAbilitiesLoop_Increment BattleScript_EffectMircleEye: @@ -5675,7 +5672,7 @@ BattleScript_EffectCharge:: attackcanceler attackstring ppreduce - setcharge + setcharge BS_ATTACKER attackanimation waitanimation .if B_CHARGE_SPDEF_RAISE >= GEN_5 @@ -6738,27 +6735,6 @@ BattleScript_TailwindEnds:: waitmessage B_WAIT_TIME_LONG end2 -BattleScript_WindPowerActivatesEnd2:: - setbyte gBattlerAttacker, 0 -BattleScript_WindPowerLoop: - printstring STRINGID_EMPTYSTRING3 - jumpifability BS_ATTACKER, ABILITY_WIND_POWER, BattleScript_WindPowerLoop_Cont - goto BattleScript_WindPowerIncrement -BattleScript_WindPowerLoop_Cont: - jumpifstatus3 BS_ATTACKER, STATUS3_CHARGED_UP, BattleScript_WindPowerIncrement - goto BattleScript_WindPower_Activate -BattleScript_WindPower_Activate: - call BattleScript_AbilityPopUp - setcharge - printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER - waitmessage B_WAIT_TIME_LONG -BattleScript_WindPowerIncrement: - addbyte gBattlerAttacker, 1 - jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_WindPowerLoop -BattleScript_WindPowerEnd: - destroyabilitypopup - end2 - BattleScript_TrickRoomEnds:: printstring STRINGID_TRICKROOMENDS waitmessage B_WAIT_TIME_LONG @@ -7233,11 +7209,8 @@ BattleScript_AngerShellRet: return BattleScript_WindPowerActivates:: -.if B_CHECK_IF_CHARGED_UP == TRUE - jumpifstatus3 BS_ATTACKER, STATUS3_CHARGED_UP, BattleScript_WindPowerActivates_Ret -.endif call BattleScript_AbilityPopUp - setcharge + setcharge BS_TARGET printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG BattleScript_WindPowerActivates_Ret: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ccec3f6a6..87cb185b4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -13198,10 +13198,11 @@ static void Cmd_setforcedtarget(void) static void Cmd_setcharge(void) { - gStatuses3[gBattlerAttacker] |= STATUS3_CHARGED_UP; - gDisableStructs[gBattlerAttacker].chargeTimer = 2; - gDisableStructs[gBattlerAttacker].chargeTimerStartValue = 2; - gBattlescriptCurrInstr++; + u8 battler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + gStatuses3[battler] |= STATUS3_CHARGED_UP; + gDisableStructs[battler].chargeTimer = 2; + gDisableStructs[battler].chargeTimerStartValue = 2; + gBattlescriptCurrInstr += 2; } // Nature Power From 843096d32ac6073c733763b96649872f45727c06 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 2 Feb 2023 22:46:24 -0500 Subject: [PATCH 005/111] update setcharge macro --- asm/macros/battle_script.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4d0b9a614..591702850 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1053,8 +1053,9 @@ .byte 0xca .endm - .macro setcharge + .macro setcharge battler:req .byte 0xcb + .byte \battler .endm .macro callterrainattack From 39b8c8e9e7ec4b6a6489f9c5d328d6579f80ef8e Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 13 Feb 2023 08:39:04 -0500 Subject: [PATCH 006/111] fix sText_BeingHitChargedPkmnWithPower battler --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 7ec079e72..ad830de28 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -768,7 +768,7 @@ static const u8 sText_AttackerMeltedTheIce[] = _("{B_ATK_NAME_WITH_PREFIX} melte static const u8 sText_TargetToughedItOut[] = _("{B_DEF_NAME_WITH_PREFIX} toughed it out\nto show you its best side!"); static const u8 sText_AttackerLostElectricType[] = _("{B_ATK_NAME_WITH_PREFIX} used up all\nof its electricity!"); static const u8 sText_AttackerSwitchedStatWithTarget[] = _("{B_ATK_NAME_WITH_PREFIX} switched {B_BUFF1}\nwith its target!"); -static const u8 sText_BeingHitChargedPkmnWithPower[] = _("Being hit by {B_CURRENT_MOVE}\ncharged {B_ATK_NAME_WITH_PREFIX} with power!"); +static const u8 sText_BeingHitChargedPkmnWithPower[] = _("Being hit by {B_CURRENT_MOVE}\ncharged {B_DEF_NAME_WITH_PREFIX} with power!"); static const u8 sText_SunlightActivatedAbility[] = _("The harsh sunlight activated\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}!"); static const u8 sText_StatWasHeightened[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!"); static const u8 sText_ElectricTerrainActivatedAbility[] = _("The Electric Terrain activated\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}!"); From 7bf34448e45aa88e95c63a6bddb668a32c98aefb Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Mon, 5 Jun 2023 14:15:07 +0200 Subject: [PATCH 007/111] Rename GAME_STAT_FISHING_CAPTURES to GAME_STAT_FISHING_ENCOUNTERS --- include/constants/game_stat.h | 2 +- src/mauville_old_man.c | 2 +- src/wild_encounter.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/constants/game_stat.h b/include/constants/game_stat.h index 053e4a8f9..5796afbae 100644 --- a/include/constants/game_stat.h +++ b/include/constants/game_stat.h @@ -13,7 +13,7 @@ #define GAME_STAT_TRAINER_BATTLES 9 #define GAME_STAT_ENTERED_HOF 10 #define GAME_STAT_POKEMON_CAPTURES 11 -#define GAME_STAT_FISHING_CAPTURES 12 +#define GAME_STAT_FISHING_ENCOUNTERS 12 #define GAME_STAT_HATCHED_EGGS 13 #define GAME_STAT_EVOLVED_POKEMON 14 #define GAME_STAT_USED_POKECENTER 15 diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c index 6075bd5d9..36b29ed73 100644 --- a/src/mauville_old_man.c +++ b/src/mauville_old_man.c @@ -969,7 +969,7 @@ static const struct Story sStorytellerStories[] = { MauvilleCity_PokemonCenter_1F_Text_PokemonCaughtStory }, { - GAME_STAT_FISHING_CAPTURES, 1, + GAME_STAT_FISHING_ENCOUNTERS, 1, MauvilleCity_PokemonCenter_1F_Text_FishingPokemonCaughtTitle, MauvilleCity_PokemonCenter_1F_Text_FishingPokemonCaughtAction, MauvilleCity_PokemonCenter_1F_Text_FishingPokemonCaughtStory diff --git a/src/wild_encounter.c b/src/wild_encounter.c index cc3ce8227..87d7d866b 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -783,7 +783,7 @@ void FishingWildEncounter(u8 rod) { species = GenerateFishingWildMon(gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo, rod); } - IncrementGameStat(GAME_STAT_FISHING_CAPTURES); + IncrementGameStat(GAME_STAT_FISHING_ENCOUNTERS); SetPokemonAnglerSpecies(species); BattleSetup_StartWildBattle(); } From 86459acb699e9182f78b163cc2a11029c859380d Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 5 Jun 2023 13:13:35 -0400 Subject: [PATCH 008/111] Fix sTVPokemonAnslerTextGroup typo --- src/tv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tv.c b/src/tv.c index b32881d09..85819a7a1 100644 --- a/src/tv.c +++ b/src/tv.c @@ -485,7 +485,7 @@ static const u8 *const sTVPokemonTodayFailedTextGroup[] = { gTVPokemonTodayFailedText06 }; -static const u8 *const sTVPokemonAnslerTextGroup[] = { +static const u8 *const sTVPokemonAnglerTextGroup[] = { gTVPokemonAnglerText00, gTVPokemonAnglerText01 }; @@ -5502,7 +5502,7 @@ static void DoTVShowPokemonAngler(void) TVShowDone(); break; } - ShowFieldMessage(sTVPokemonAnslerTextGroup[state]); + ShowFieldMessage(sTVPokemonAnglerTextGroup[state]); } static void DoTVShowTheWorldOfMasters(void) From 9c4a59f865360b7d6e0dede0e52812b897526588 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 5 Jun 2023 19:53:59 -0400 Subject: [PATCH 009/111] Fix swapped Dodrio Berry Picking palettes --- graphics/dodrio_berry_picking/bg.pal | 19 ------------------- graphics/dodrio_berry_picking/tree_border.pal | 19 ------------------- src/dodrio_berry_picking.c | 8 ++++---- 3 files changed, 4 insertions(+), 42 deletions(-) delete mode 100644 graphics/dodrio_berry_picking/bg.pal delete mode 100644 graphics/dodrio_berry_picking/tree_border.pal diff --git a/graphics/dodrio_berry_picking/bg.pal b/graphics/dodrio_berry_picking/bg.pal deleted file mode 100644 index c06550002..000000000 --- a/graphics/dodrio_berry_picking/bg.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -230 246 255 -82 180 172 -82 205 189 -156 156 131 -106 156 148 -123 123 98 -189 172 98 -189 189 139 -74 172 156 -172 172 131 -74 156 123 -115 115 82 -139 139 106 -164 164 115 -197 197 148 -230 246 255 diff --git a/graphics/dodrio_berry_picking/tree_border.pal b/graphics/dodrio_berry_picking/tree_border.pal deleted file mode 100644 index be2b62cc9..000000000 --- a/graphics/dodrio_berry_picking/tree_border.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -230 246 255 -246 246 222 -230 230 180 -139 238 139 -246 246 189 -197 246 164 -246 230 197 -230 246 255 -230 213 180 -205 197 164 -148 222 148 -222 238 255 -139 205 139 -213 238 246 -222 246 255 -213 205 164 diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 8d47595c8..1ba82c6d2 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -552,8 +552,8 @@ static const u8 sUnsharedColumns[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = }; // Duplicate and unused gfx. Feel free to remove. -static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.gbapal", - "graphics/dodrio_berry_picking/tree_border.gbapal", +static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.gbapal", + "graphics/dodrio_berry_picking/bg.gbapal", "graphics/dodrio_berry_picking/dodrio.gbapal", "graphics/dodrio_berry_picking/shiny.gbapal", "graphics/dodrio_berry_picking/status.gbapal", @@ -3586,8 +3586,8 @@ static const u8 sUnsharedColumns_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = {1, 3, 5, 6, 9}, }; -static const u16 sBg_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/bg.gbapal", - "graphics/dodrio_berry_picking/tree_border.gbapal"); +static const u16 sBg_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/tree_border.gbapal", + "graphics/dodrio_berry_picking/bg.gbapal"); static const u16 sDodrioNormal_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/dodrio.gbapal"); static const u16 sDodrioShiny_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/shiny.gbapal"); static const u16 sStatus_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/status.gbapal"); From 62f592f4df59e39b77fe356c8d1aff1f23208ad3 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 6 Jun 2023 09:02:52 +0100 Subject: [PATCH 010/111] Fix EWRAM_DATA wildcards `ewram_data` not `.ewram_data`, doh! --- ld_script.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ld_script.txt b/ld_script.txt index bd9d7c4a3..4be596524 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -20,8 +20,8 @@ SECTIONS { . = 0x1C000; INCLUDE "sym_ewram.ld" - src/*.o(.ewram_data); - gflib/*.o(.ewram_data); + src/*.o(ewram_data); + gflib/*.o(ewram_data); *libc.a:impure.o(.data); *libc.a:locale.o(.data); From 2651401e6b17a0ab5db1f28ec5c8220434950c42 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Mon, 29 May 2023 01:00:38 +0200 Subject: [PATCH 011/111] Fix PATH for modern target for non dkp systems When prepending something to PATH, we should use PATH=/foo/bar:$PATH and not PATH=/foo/bar:PATH. Because your shell won't certainly find something under the literal name PATH. If one is not using devkitarm, TOOLCHAIN will resolve to an empty string. If TOOLCHAIN is an empty string the only search path for the modern gcc will be /bin which may work on some installations but is probably not what was originally intended with this line. So let's just search the standard search path if nothing can be found under $(TOOLCHAIN). Either way, PATH is already set up previously, so we can make sure MODERNCC is invoked properly by calling MODERNCC with PATH=$(PATH). --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 50a7e0d25..7476a9dc3 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ LD := $(PREFIX)ld # note: the makefile must be set up so MODERNCC is never called # if MODERN=0 MODERNCC := $(PREFIX)gcc -PATH_MODERNCC := PATH=$(TOOLCHAIN)/bin:PATH $(MODERNCC) +PATH_MODERNCC := PATH="$(PATH)" $(MODERNCC) ifeq ($(OS),Windows_NT) EXE := .exe From b2901c51b0a589de6a1b8bd5971ee244a9c62b80 Mon Sep 17 00:00:00 2001 From: PSF Date: Tue, 27 Jun 2023 15:32:49 -0700 Subject: [PATCH 012/111] Added bugfix for SaveBeforeLinkMultisChallenge to remove extra incrementgamestat --- data/maps/BattleFrontier_BattleTowerLobby/scripts.inc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index e99c7f88e..8d60105bd 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -421,7 +421,12 @@ BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeLinkMultisChallenge:: call Common_EventScript_SaveGame setvar VAR_TEMP_0, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed +@ GAME_STAT_ENTERED_BATTLE_TOWER should not be incremented here, for two reasons: +@ 1. It is incremented again in BattleFrontier_BattleTowerLobby_EventScript_CableLinkSuccessful or BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful +@ 2. If the player tries to save, but fails, the counter will still be incremented even if the player never enters the tower. +.ifndef BUGFIX incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER +.endif specialvar VAR_RESULT, IsWirelessAdapterConnected goto_if_eq VAR_RESULT, TRUE, BattleFrontier_BattleTowerLobby_EventScript_TryWirelessLink goto BattleFrontier_BattleTowerLobby_EventScript_TryCableLink From 68ce97cd906164aadbd3db5b318a59285af962dc Mon Sep 17 00:00:00 2001 From: gruxor <95389790+gruxor@users.noreply.github.com> Date: Sun, 2 Jul 2023 19:41:47 -0400 Subject: [PATCH 013/111] Fixed shadows in viewer (#3094) * Fixed shadows in viewer + minor arg signature fix * Unfixed castform functions, upcoming removal --- src/pokemon_debug.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 2e9f04506..d3277caa9 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1298,8 +1298,9 @@ static void ApplyOffsetSpriteValues(struct PokemonDebugMenu *data) gSprites[data->backspriteId].y = DEBUG_MON_BACK_Y + gMonBackPicCoords[species].y_offset + data->offsetsSpriteValues.offset_back_picCoords; //Front gSprites[data->frontspriteId].y = GetBattlerSpriteFinal_YCustom(species, data->offsetsSpriteValues.offset_front_picCoords, data->offsetsSpriteValues.offset_front_elevation); - //Shadow if one was added - UpdateShadowSpriteInvisible(data); + + if (data->currentSubmenu == 2) + UpdateShadowSpriteInvisible(data); } static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment) From 81522554c22885c227704ae398bb1489a67582ae Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Tue, 4 Jul 2023 12:19:38 -0400 Subject: [PATCH 014/111] Fixed KNOWN_FAILING tests running memory leak checks when unneeded (#3102) --- test/test_runner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_runner.c b/test/test_runner.c index c0459fbe6..450dc77a6 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -155,7 +155,7 @@ void CB2_TestRunner(void) if (gTestRunnerState.test->runner->tearDown) gTestRunnerState.test->runner->tearDown(gTestRunnerState.test->data); - if (gTestRunnerState.result == gTestRunnerState.expectedResult + if (gTestRunnerState.result == TEST_RESULT_PASS && !gTestRunnerState.expectLeaks) { const struct MemBlock *head = HeapHead(); From eab4e32e2a5956633d04baef1e524ba66f90610f Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Wed, 5 Jul 2023 18:46:40 +0100 Subject: [PATCH 015/111] Shuffle implementation (#3097) --- include/random.h | 16 ++++++++++++++++ src/random.c | 42 ++++++++++++++++++++++++++++++++++++++++++ test/random.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/include/random.h b/include/random.h index 5b88db1f5..86995e36c 100644 --- a/include/random.h +++ b/include/random.h @@ -20,6 +20,22 @@ u16 Random2(void); void SeedRng(u16 seed); void SeedRng2(u16 seed); +void Shuffle8(void *data, size_t n); +void Shuffle16(void *data, size_t n); +void Shuffle32(void *data, size_t n); +void ShuffleN(void *data, size_t n, size_t size); + +static inline void Shuffle(void *data, size_t n, size_t size) +{ + switch (size) + { + case 1: Shuffle8(data, n); break; + case 2: Shuffle16(data, n); break; + case 4: Shuffle32(data, n); break; + default: ShuffleN(data, n, size); break; + } +} + /* Structured random number generator. * Instead of the caller converting bits from Random() to a meaningful * value, the caller provides metadata that is used to return the diff --git a/src/random.c b/src/random.c index 14983e776..345d585c2 100644 --- a/src/random.c +++ b/src/random.c @@ -32,6 +32,48 @@ u16 Random2(void) return gRng2Value >> 16; } +#define SHUFFLE_IMPL \ + u32 tmp; \ + --n; \ + while (n > 1) \ + { \ + int j = Random() % (n+1); \ + SWAP(data[n], data[j], tmp); \ + --n; \ + } + +void Shuffle8(void *data_, size_t n) +{ + u8 *data = data_; + SHUFFLE_IMPL; +} + +void Shuffle16(void *data_, size_t n) +{ + u16 *data = data_; + SHUFFLE_IMPL; +} + +void Shuffle32(void *data_, size_t n) +{ + u32 *data = data_; + SHUFFLE_IMPL; +} + +void ShuffleN(void *data, size_t n, size_t size) +{ + void *tmp = alloca(size); + --n; + while (n > 1) + { + int j = Random() % (n+1); + memcpy(tmp, (u8 *)data + n*size, size); // tmp = data[n]; + memcpy((u8 *)data + n*size, (u8 *)data + j*size, size); // data[n] = data[j]; + memcpy((u8 *)data + j*size, tmp, size); // data[j] = tmp; + --n; + } +} + __attribute__((weak, alias("RandomUniformDefault"))) u32 RandomUniform(enum RandomTag tag, u32 lo, u32 hi); diff --git a/test/random.c b/test/random.c index 39f587c06..ef364de27 100644 --- a/test/random.c +++ b/test/random.c @@ -2,6 +2,47 @@ #include "test.h" #include "random.h" +// We expect each element to have an indexSum of 3.5 * 1024. +// Therefore the maximum error is 8*3584, or 28672. +#define SHUFFLE_TEST_IMPL \ + u32 i, j, error; \ + u16 indexSum[7]; \ + memset(indexSum, 0, sizeof(indexSum)); \ + for (i = 0; i < 1024; i++) \ + { \ + Shuffle(array, ARRAY_COUNT(array), sizeof(array[0])); \ + for (j = 0; j < ARRAY_COUNT(array); j++) \ + indexSum[array[j]] += j; \ + } \ + error = 0; \ + for (i = 0; i < ARRAY_COUNT(indexSum); i++) \ + error += abs(3584 - indexSum[i]); \ + EXPECT_LT(error, (int)(28672 * 0.025)); + +TEST("Shuffle randomizes the array [Shuffle8]") +{ + u8 array[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; + SHUFFLE_TEST_IMPL; +} + +TEST("Shuffle randomizes the array [Shuffle16]") +{ + u16 array[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; + SHUFFLE_TEST_IMPL; +} + +TEST("Shuffle randomizes the array [Shuffle32]") +{ + u32 array[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; + SHUFFLE_TEST_IMPL; +} + +TEST("Shuffle randomizes the array [Shuffle64]") +{ + u64 array[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; + SHUFFLE_TEST_IMPL; +} + TEST("RandomUniform generates lo..hi") { u32 lo, hi, i; From 34aff01d3a8dbea5cc08e6728f9a279aabf61ee7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 5 Jul 2023 20:52:24 +0200 Subject: [PATCH 016/111] Fix graphical/exp bugs with 2 vs 1 trainer battles (#3105) --- src/battle_anim_throw.c | 6 +++--- src/battle_controller_player.c | 2 +- src/battle_gfx_sfx_util.c | 2 +- src/battle_script_commands.c | 7 ++----- src/reshow_battle_screen.c | 6 ++---- 5 files changed, 9 insertions(+), 14 deletions(-) mode change 100755 => 100644 src/battle_anim_throw.c diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c old mode 100755 new mode 100644 index 4a3cf7cf2..8f244717a --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -2491,11 +2491,11 @@ void TryShinyAnimation(u8 battler, struct Pokemon *mon) illusionMon = GetIllusionMonPtr(battler); if (illusionMon != NULL) mon = illusionMon; - + otId = GetMonData(mon, MON_DATA_OT_ID); personality = GetMonData(mon, MON_DATA_PERSONALITY); - if (IsBattlerSpriteVisible(battler)) + if (IsBattlerSpriteVisible(battler) && IsValidForBattle(mon)) { shinyValue = GET_SHINY_VALUE(otId, personality); if (shinyValue < SHINY_ODDS) @@ -2771,7 +2771,7 @@ void AnimTask_GetTrappedMoveAnimId(u8 taskId) gBattleAnimArgs[0] = TRAP_ANIM_BIND; break; } - + DestroyAnimVisualTask(taskId); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index c88dbff78..294eee9aa 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1377,7 +1377,7 @@ static void Task_GiveExpToMon(u8 taskId) u8 battlerId = gTasks[taskId].tExpTask_battler; s32 gainedExp = GetTaskExpValue(taskId); - if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar. + if (WhichBattleCoords(battlerId) == 1 || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar. { struct Pokemon *mon = &gPlayerParty[monId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 5f168d88b..06fc26f74 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -558,7 +558,7 @@ static void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId, bool32 op if (illusionMon != NULL) mon = illusionMon; - if (GetMonData(mon, MON_DATA_IS_EGG)) // Don't load GFX of egg pokemon. + if (GetMonData(mon, MON_DATA_IS_EGG) || GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NONE) // Don't load GFX of egg pokemon. return; monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b8d8c6866..d4975fd7b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4268,9 +4268,7 @@ static void Cmd_getexp(void) for (viaSentIn = 0, i = 0; i < PARTY_SIZE; i++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - continue; - if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + if (!IsValidForBattle(&gPlayerParty[i])) continue; if (gBitTable[i] & sentIn) viaSentIn++; @@ -4361,8 +4359,7 @@ static void Cmd_getexp(void) gBattleStruct->wildVictorySong++; } - if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP) - && !GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_IS_EGG)) + if (IsValidForBattle(&gPlayerParty[gBattleStruct->expGetterMonId])) { if (gBattleStruct->sentInPokes & 1) gBattleMoveDamage = *exp; diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index b24db3f87..e9b817ff2 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -256,9 +256,7 @@ static void CreateBattlerSprite(u8 battler) } else { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) - return; - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_IS_EGG)) + if (!IsValidForBattle(&gPlayerParty[gBattlerPartyIndexes[battler]])) return; SetMultiuseSpriteTemplateToPokemon(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); @@ -313,7 +311,7 @@ static void CreateHealthboxSprite(u8 battler) } else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0 || GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_IS_EGG)) + if (!IsValidForBattle(&gPlayerParty[gBattlerPartyIndexes[battler]])) SetHealthboxSpriteInvisible(healthboxSpriteId); } } From 1a53154324b5b5a7338c2832c3497eb1c46c0214 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 5 Jul 2023 14:59:42 -0400 Subject: [PATCH 017/111] Beat Up AI Damage Calc (#3104) * add specific AI dmg calc for new beat up * beat up ai calc optimizations --------- Co-authored-by: ghoulslash --- include/pokemon.h | 1 + src/battle_ai_util.c | 14 ++++++++++++++ src/pokemon.c | 31 +++++++++++++++---------------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index f20b23e79..022c155ae 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -611,5 +611,6 @@ bool32 TryFormChange(u32 monId, u32 side, u16 method); void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method); u32 GetMonFriendshipScore(struct Pokemon *pokemon); void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality); +u8 CalculatePartyCount(struct Pokemon *party); #endif // GUARD_POKEMON_H diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 81b6e9cbd..3deabc5f5 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -833,6 +833,20 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness, case EFFECT_FINAL_GAMBIT: dmg = gBattleMons[battlerAtk].hp; break; + #if B_BEAT_UP >= GEN_5 + case EFFECT_BEAT_UP: + { + u32 partyCount = CalculatePartyCount(GetBattlerParty(battlerAtk)); + u32 i; + gBattleStruct->beatUpSlot = 0; + dmg = 0; + for (i = 0; i < partyCount; i++) { + dmg += CalculateMoveDamage(move, battlerAtk, battlerDef, moveType, 0, FALSE, FALSE, FALSE); + } + gBattleStruct->beatUpSlot = 0; + } + break; + #endif } // Handle other multi-strike moves diff --git a/src/pokemon.c b/src/pokemon.c index 748fcdfb0..fca93e67e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5432,29 +5432,28 @@ u8 SendMonToPC(struct Pokemon* mon) return MON_CANT_GIVE; } +u8 CalculatePartyCount(struct Pokemon *party) +{ + u32 partyCount = 0; + + while (partyCount < PARTY_SIZE + && GetMonData(&party[partyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + partyCount++; + } + + return partyCount; +} + u8 CalculatePlayerPartyCount(void) { - gPlayerPartyCount = 0; - - while (gPlayerPartyCount < PARTY_SIZE - && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - { - gPlayerPartyCount++; - } - + gPlayerPartyCount = CalculatePartyCount(gPlayerParty); return gPlayerPartyCount; } u8 CalculateEnemyPartyCount(void) { - gEnemyPartyCount = 0; - - while (gEnemyPartyCount < PARTY_SIZE - && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - { - gEnemyPartyCount++; - } - + gEnemyPartyCount = CalculatePartyCount(gEnemyParty); return gEnemyPartyCount; } From 9a09f1e3b9921a99a478d9dcc3ff83f11d444816 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Jul 2023 13:41:16 +0200 Subject: [PATCH 018/111] Fix Roullout Fury Cutter AI power calc --- include/battle_util.h | 4 +++- src/battle_ai_util.c | 20 +++++++++++++++++--- src/battle_util.c | 30 ++++++++++++++++++++++-------- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index b5ba5249e..2a966e0ac 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -165,8 +165,10 @@ bool32 IsBattlerGrounded(u8 battlerId); bool32 IsBattlerAlive(u8 battlerId); u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move); u32 GetBattlerWeight(u8 battlerId); +u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); +u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags); -s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 *typeEffectivenessModifier); +s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, u16 *typeEffectivenessModifier); u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities); u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); u16 GetTypeModifier(u8 atkType, u8 defType); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 7730604c8..9fdf08123 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -785,7 +785,7 @@ static bool32 AI_GetIfCrit(u32 move, u8 battlerAtk, u8 battlerDef) s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness, bool32 considerZPower) { - s32 dmg, moveType, critDmg, normalDmg; + s32 dmg, moveType, critDmg, normalDmg, fixedBasePower, n; s8 critChance; u16 effectivenessMultiplier; @@ -814,8 +814,22 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness, { ProteanTryChangeType(battlerAtk, AI_DATA->abilities[battlerAtk], move, moveType); critChance = GetInverseCritChance(battlerAtk, battlerDef, move); - normalDmg = CalculateMoveDamageAndEffectiveness(move, battlerAtk, battlerDef, moveType, &effectivenessMultiplier); - critDmg = CalculateMoveDamage(move, battlerAtk, battlerDef, moveType, 0, TRUE, FALSE, FALSE); + // Certain moves like Rollout calculate damage based on values which change during the move execution, but before calling dmg calc. + switch (gBattleMoves[move].effect) + { + case EFFECT_ROLLOUT: + n = gDisableStructs[battlerAtk].rolloutTimer - 1; + fixedBasePower = CalcRolloutBasePower(battlerAtk, gBattleMoves[move].power, n < 0 ? 5 : n); + break; + case EFFECT_FURY_CUTTER: + fixedBasePower = CalcFuryCutterBasePower(gBattleMoves[move].power, min(gDisableStructs[battlerAtk].furyCutterCounter + 1, 5)); + break; + default: + fixedBasePower = 0; + break; + } + normalDmg = CalculateMoveDamageAndEffectiveness(move, battlerAtk, battlerDef, moveType, fixedBasePower, &effectivenessMultiplier); + critDmg = CalculateMoveDamage(move, battlerAtk, battlerDef, moveType, fixedBasePower, TRUE, FALSE, FALSE); if (critChance == -1) dmg = normalDmg; diff --git a/src/battle_util.c b/src/battle_util.c index e608b0e51..3d56cc2b7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8447,6 +8447,24 @@ const struct TypePower gNaturalGiftTable[] = [ITEM_TO_BERRY(ITEM_MARANGA_BERRY)] = {TYPE_DARK, 100}, }; +u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer) +{ + u32 i; + for (i = 1; i < (5 - rolloutTimer); i++) + basePower *= 2; + if (gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL) + basePower *= 2; + return basePower; +} + +u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter) +{ + u32 i; + for (i = 1; i < furyCutterCounter; i++) + basePower *= 2; + return basePower; +} + static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) { u32 i; @@ -8483,14 +8501,10 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower = 10 * (MAX_FRIENDSHIP - gBattleMons[battlerAtk].friendship) / 25; break; case EFFECT_FURY_CUTTER: - for (i = 1; i < gDisableStructs[battlerAtk].furyCutterCounter; i++) - basePower *= 2; + basePower = CalcFuryCutterBasePower(basePower, gDisableStructs[battlerAtk].furyCutterCounter); break; case EFFECT_ROLLOUT: - for (i = 1; i < (5 - gDisableStructs[battlerAtk].rolloutTimer); i++) - basePower *= 2; - if (gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL) - basePower *= 2; + basePower = CalcRolloutBasePower(battlerAtk, basePower, gDisableStructs[battlerAtk].rolloutTimer); break; case EFFECT_MAGNITUDE: basePower = gBattleStruct->magnitudeBasePower; @@ -9694,10 +9708,10 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 } // for AI - get move damage and effectiveness with one function call -s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 *typeEffectivenessModifier) +s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, u16 *typeEffectivenessModifier) { *typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, FALSE); - return DoMoveDamageCalc(move, battlerAtk, battlerDef, moveType, 0, FALSE, FALSE, FALSE, *typeEffectivenessModifier); + return DoMoveDamageCalc(move, battlerAtk, battlerDef, moveType, fixedBasePower, FALSE, FALSE, FALSE, *typeEffectivenessModifier); } static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 battlerAtk, bool32 recordAbilities) From 010ce6bc634ed9cd0dd2133fbc1dc4f25af3fe90 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 6 Jul 2023 11:56:04 -0400 Subject: [PATCH 019/111] Revert "Install libpng using pacman instead of manual build for msys2" This reverts commit dc2e210ade38bc5789764d0c3836c3d995a1d4ef. --- INSTALL.md | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 01fbd5cee..9aca02a15 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -125,12 +125,12 @@ Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), or conti Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert. -1. Open msys2 at C:\devkitPro\msys2\mingw64.exe or run `C:\devkitPro\msys2\msys2_shell.bat -mingw64`. +1. Open msys2 at C:\devkitPro\msys2\msys2_shell.bat. 2. Certain packages are required to build pokeemerald. Install these by running the following command: ```bash - pacman -S make zlib-devel git mingw-w64-x86_64-gcc mingw-w64-x86_64-libpng + pacman -S make gcc zlib-devel git ```
Note... @@ -138,6 +138,39 @@ Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert. > This command will ask for confirmation, just enter the yes action when prompted.
+3. Download [libpng](https://sourceforge.net/projects/libpng/files/libpng16/1.6.37/libpng-1.6.37.tar.xz/download). + +4. Change directory to where libpng was downloaded. By default, msys2 will start in the current user's profile folder, located at **C:\Users\\⁠_\_**, where *\* is your Windows username. In most cases, libpng should be saved within a subfolder of the profile folder. For example, if libpng was saved to **C:\Users\\_\_\Downloads** (the Downloads location for most users), enter this command: + + ```bash + cd Downloads + ``` + +
+ Notes... + + > Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\` as the directory separator. + > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Downloads/My Downloads"`. + > Note 3: Windows path names are case-insensitive so adhering to capitalization isn’t needed. + > Note 4: If libpng was saved elsewhere, you will need to specify the full path to where libpng was downloaded, e.g. `cd c:/devkitpro/msys2` if it was saved there. +
+ +5. Run the following commands to uncompress and install libpng. + + ```bash + tar xf libpng-1.6.37.tar.xz + cd libpng-1.6.37 + ./configure --prefix=/usr + make check + make install + ``` + +6. Then finally, run the following command to change back to the user profile folder. + + ```bash + cd + ``` + ### Choosing where to store pokeemerald (msys2) At this point, you can choose a folder to store pokeemerald into. If you're okay with storing pokeemerald in the user profile folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokeemerald is stored when changing directory to the pokeemerald folder. From 1980a115b4d66f7bf9f4325b05b6f7877276806f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 6 Jul 2023 13:07:03 -0400 Subject: [PATCH 020/111] Integrated GAME_STAT_ENTERED_BATTLE_TOWER bugfix from upstream --- data/maps/BattleFrontier_BattleTowerLobby/scripts.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index bc7b6709f..8d60105bd 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -424,9 +424,9 @@ BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeLinkMultisChallenge:: @ GAME_STAT_ENTERED_BATTLE_TOWER should not be incremented here, for two reasons: @ 1. It is incremented again in BattleFrontier_BattleTowerLobby_EventScript_CableLinkSuccessful or BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful @ 2. If the player tries to save, but fails, the counter will still be incremented even if the player never enters the tower. -@.ifndef BUGFIX +.ifndef BUGFIX incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER -@.endif +.endif specialvar VAR_RESULT, IsWirelessAdapterConnected goto_if_eq VAR_RESULT, TRUE, BattleFrontier_BattleTowerLobby_EventScript_TryWirelessLink goto BattleFrontier_BattleTowerLobby_EventScript_TryCableLink From cf9b933a5fc355c6f89eac9554d512ad6082bbbd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Jul 2023 21:08:28 +0200 Subject: [PATCH 021/111] Fix Z-Moves softlocking when the z move effect was not used (#3108) --- src/battle_z_move.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 2e06323ba..dec3701c0 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -628,6 +628,10 @@ void SetZEffect(void) BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_ZEffectPrintString; } + else + { + gBattlescriptCurrInstr += Z_EFFECT_BS_LENGTH; + } break; case Z_EFFECT_BOOST_CRITS: if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY)) @@ -637,6 +641,10 @@ void SetZEffect(void) BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_ZEffectPrintString; } + else + { + gBattlescriptCurrInstr += Z_EFFECT_BS_LENGTH; + } break; case Z_EFFECT_FOLLOW_ME: gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTimer = 1; @@ -653,6 +661,10 @@ void SetZEffect(void) BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_RecoverHPZMove; } + else + { + gBattlescriptCurrInstr += Z_EFFECT_BS_LENGTH; + } break; case Z_EFFECT_RESTORE_REPLACEMENT_HP: gBattleStruct->zmove.healReplacement = TRUE; From 98ae1beaecb751531e224ee884eab504039c3bb5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Jul 2023 21:10:28 +0200 Subject: [PATCH 022/111] Fix ability pop-up properly updating text (#3107) --- src/battle_interface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index f2ca798db..1a4909818 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2880,10 +2880,10 @@ static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTi } } -static const u8 sText_Space16[]= _(" "); +static const u8 sText_Spaces20[]= _(" "); static void ClearAbilityName(u8 spriteId1, u8 spriteId2) { - PrintOnAbilityPopUp(sText_Space16, + PrintOnAbilityPopUp(sText_Spaces20, (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, 5, 12, From 6482279fa37c0857897a5b9d5fcac2b55ffd53f8 Mon Sep 17 00:00:00 2001 From: sbird Date: Fri, 7 Jul 2023 14:11:49 +0200 Subject: [PATCH 023/111] [battle, math] refactor damage calculation to use proper fp type and inlined multiplication --- include/battle.h | 2 +- include/battle_ai_util.h | 2 +- include/battle_util.h | 13 +- include/fpmath.h | 61 ++++++ include/global.h | 27 +-- src/battle_ai_switch_items.c | 12 +- src/battle_ai_util.c | 11 +- src/battle_dome.c | 2 +- src/battle_util.c | 360 +++++++++++++++++------------------ test/fpmath.c | 18 ++ 10 files changed, 279 insertions(+), 229 deletions(-) create mode 100644 include/fpmath.h create mode 100644 test/fpmath.c diff --git a/include/battle.h b/include/battle.h index 5ad99673f..9995a2a24 100644 --- a/include/battle.h +++ b/include/battle.h @@ -656,7 +656,7 @@ struct BattleStruct u8 battleBondTransformed[NUM_BATTLE_SIDES]; // Bitfield for each party. u8 storedHealingWish:4; // Each battler as a bit. u8 storedLunarDance:4; // Each battler as a bit. - u16 supremeOverlordModifier[MAX_BATTLERS_COUNT]; + uq4_12_t supremeOverlordModifier[MAX_BATTLERS_COUNT]; u8 itemPartyIndex[MAX_BATTLERS_COUNT]; u8 itemMoveIndex[MAX_BATTLERS_COUNT]; bool8 trainerSlideHalfHpMsgDone; diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 99eb03f54..580e040d0 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -87,7 +87,7 @@ bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split); s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *effectiveness, bool32 considerZPower); u8 GetMoveDamageResult(u16 move); u32 GetCurrDamageHpPercent(u8 battlerAtk, u8 battlerDef); -u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef); +uq4_12_t AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef); u32 AI_GetMoveEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef); u16 *GetMovesArray(u32 battler); bool32 IsConfusionMoveEffect(u16 moveEffect); diff --git a/include/battle_util.h b/include/battle_util.h index 9976720ee..b6c397bc7 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -166,10 +166,10 @@ bool32 IsBattlerAlive(u8 battlerId); u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move); u32 GetBattlerWeight(u8 battlerId); s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags); -s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 *typeEffectivenessModifier); -u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities); -u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); -u16 GetTypeModifier(u8 atkType, u8 defType); +s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, uq4_12_t *typeEffectivenessModifier); +uq4_12_t CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities); +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); +uq4_12_t GetTypeModifier(u8 atkType, u8 defType); s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp); bool32 CanMegaEvolve(u8 battlerId); @@ -240,4 +240,9 @@ u8 GetBattlerGender(u8 battlerId); bool8 AreBattlersOfOppositeGender(u8 battler1, u8 battler2); u32 CalcSecondaryEffectChance(u8 battlerId, u8 secondaryEffectChance); +static inline u32 ApplyModifier(uq4_12_t modifier, u32 val) +{ + return UQ_4_12_TO_INT((modifier * val) + UQ_4_12_ROUND); +} + #endif // GUARD_BATTLE_UTIL_H diff --git a/include/fpmath.h b/include/fpmath.h new file mode 100644 index 000000000..7e25a92a4 --- /dev/null +++ b/include/fpmath.h @@ -0,0 +1,61 @@ +#ifndef FPMATH_H_ +#define FPMATH_H_ + +typedef s32 q4_12_t; +typedef u32 uq4_12_t; + +#define Q_4_12_SHIFT (12) +#define UQ_4_12_SHIFT (12) + +// Converts a number to Q8.8 fixed-point format +#define Q_8_8(n) ((s16)((n) * 256)) + +// Converts a number to Q4.12 fixed-point format +#define Q_4_12(n) ((q4_12_t)((n) * 4096)) +#define UQ_4_12(n) ((uq4_12_t)((n) * 4096)) + +// Converts a number to Q24.8 fixed-point format +#define Q_24_8(n) ((s32)((n) * 256)) + +// Converts a Q8.8 fixed-point format number to a regular integer +#define Q_8_8_TO_INT(n) ((s32)((n) / 256)) + +// Converts a Q4.12 fixed-point format number to a regular integer +#define Q_4_12_TO_INT(n) ((s32)((n) / 4096)) +#define UQ_4_12_TO_INT(n) ((u32)((n) / 4096)) + +// Converts a Q24.8 fixed-point format number to a regular integer +#define Q_24_8_TO_INT(n) ((s32)((n) / 256)) + +// Rounding value for Q4.12 fixed-point format +#define Q_4_12_ROUND ((1) << (Q_4_12_SHIFT - 1)) +#define UQ_4_12_ROUND ((1) << (UQ_4_12_SHIFT - 1)) + +// Basic arithmetic for fixed point number formats +// Consumers should use encapsulated functions where possible + +// FP API does not provide sanity checks against overflows + +static inline uq4_12_t uq4_12_add(uq4_12_t a, uq4_12_t b) +{ + return a + b; +} + +static inline uq4_12_t uq4_12_subtract(uq4_12_t a, uq4_12_t b) +{ + return a - b; +} + +static inline uq4_12_t uq4_12_multiply(uq4_12_t a, uq4_12_t b) +{ + u32 product = (u32) a * b; + return (product + UQ_4_12_ROUND) >> UQ_4_12_SHIFT; +} + +static inline uq4_12_t uq4_12_divide(uq4_12_t dividend, uq4_12_t divisor) +{ + if (divisor == UQ_4_12(0.0)) return UQ_4_12(0); + return (dividend << UQ_4_12_SHIFT) / divisor; +} + +#endif // FPMATH_H_ diff --git a/include/global.h b/include/global.h index eca45bdb6..d30ca045e 100644 --- a/include/global.h +++ b/include/global.h @@ -5,6 +5,7 @@ #include #include "config.h" // we need to define config before gba headers as print stuff needs the functions nulled before defines. #include "gba/gba.h" +#include "fpmath.h" #include "constants/global.h" #include "constants/flags.h" #include "constants/vars.h" @@ -51,32 +52,6 @@ b = temp; \ } -// useful math macros - -// Converts a number to Q8.8 fixed-point format -#define Q_8_8(n) ((s16)((n) * 256)) - -// Converts a number to Q4.12 fixed-point format -#define Q_4_12(n) ((s16)((n) * 4096)) -#define UQ_4_12(n) ((u16)((n) * 4096)) - -// Converts a number to Q24.8 fixed-point format -#define Q_24_8(n) ((s32)((n) << 8)) - -// Converts a Q8.8 fixed-point format number to a regular integer -#define Q_8_8_TO_INT(n) ((int)((n) / 256)) - -// Converts a Q4.12 fixed-point format number to a regular integer -#define Q_4_12_TO_INT(n) ((int)((n) / 4096)) -#define UQ_4_12_TO_INT(n) ((int)((n) / 4096)) - -// Converts a Q24.8 fixed-point format number to a regular integer -#define Q_24_8_TO_INT(n) ((int)((n) >> 8)) - -// Rounding value for Q4.12 fixed-point format -#define Q_4_12_ROUND ((1) << (12 - 1)) -#define UQ_4_12_ROUND ((1) << (12 - 1)) - #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) >= (b) ? (a) : (b)) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 48ca258a8..73d7ecb64 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -822,7 +822,7 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, while (bits != 0x3F) // All mons were checked. { - u16 bestResist = UQ_4_12(1.0); + uq4_12_t bestResist = UQ_4_12(1.0); int bestMonId = PARTY_SIZE; // Find the mon whose type is the most suitable defensively. for (i = firstId; i < lastId; i++) @@ -830,21 +830,21 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, if (!(gBitTable[i] & invalidMons) && !(gBitTable[i] & bits)) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - u16 typeEffectiveness = UQ_4_12(1.0); + uq4_12_t typeEffectiveness = UQ_4_12(1.0); u8 atkType1 = gBattleMons[opposingBattler].type1; u8 atkType2 = gBattleMons[opposingBattler].type2; u8 defType1 = gSpeciesInfo[species].types[0]; u8 defType2 = gSpeciesInfo[species].types[1]; - MulModifier(&typeEffectiveness, (GetTypeModifier(atkType1, defType1))); + typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); if (atkType2 != atkType1) - MulModifier(&typeEffectiveness, (GetTypeModifier(atkType2, defType1))); + typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType1))); if (defType2 != defType1) { - MulModifier(&typeEffectiveness, (GetTypeModifier(atkType1, defType2))); + typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType2))); if (atkType2 != atkType1) - MulModifier(&typeEffectiveness, (GetTypeModifier(atkType2, defType2))); + typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType2))); } if (typeEffectiveness < bestResist) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3deabc5f5..97c0c3202 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -31,7 +31,7 @@ } \ return FALSE -static u32 AI_GetEffectiveness(u16 multiplier); +static u32 AI_GetEffectiveness(uq4_12_t multiplier); // Const Data static const s8 sAiAbilityRatings[ABILITIES_COUNT] = @@ -768,7 +768,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness, { s32 dmg, moveType, critDmg, normalDmg; s8 critChance; - u16 effectivenessMultiplier; + uq4_12_t effectivenessMultiplier; if (considerZPower && IsViableZMove(battlerAtk, move)) { @@ -1003,9 +1003,10 @@ u32 GetCurrDamageHpPercent(u8 battlerAtk, u8 battlerDef) return (bestDmg * 100) / gBattleMons[battlerDef].maxHP; } -u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef) +uq4_12_t AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef) { - u16 typeEffectiveness, moveType; + uq4_12_t typeEffectiveness; + u16 moveType; SaveBattlerData(battlerAtk); SaveBattlerData(battlerDef); @@ -1030,7 +1031,7 @@ u32 AI_GetMoveEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef) return AI_GetEffectiveness(AI_GetTypeEffectiveness(move, battlerAtk, battlerDef)); } -static u32 AI_GetEffectiveness(u16 multiplier) +static u32 AI_GetEffectiveness(uq4_12_t multiplier) { switch (multiplier) { diff --git a/src/battle_dome.c b/src/battle_dome.c index deae7e64f..ba8d27b9a 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -5206,7 +5206,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun u32 personality = 0; u32 targetSpecies = 0; u32 targetAbility = 0; - u32 typeMultiplier = 0; + uq4_12_t typeMultiplier = 0; do { personality = Random32(); diff --git a/src/battle_util.c b/src/battle_util.c index 06d6e4897..438d98016 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -62,8 +62,8 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId); static u8 GetFlingPowerFromItemId(u16 itemId); static void SetRandomMultiHitCounter(); static u32 GetBattlerItemHoldEffectParam(u8 battlerId, u16 item); -static u16 GetInverseTypeMultiplier(u16 multiplier); -static u16 GetSupremeOverlordModifier(u8 battlerId); +static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier); +static uq4_12_t GetSupremeOverlordModifier(u8 battlerId); static bool8 CanBeInfinitelyConfused(u8 battlerId); extern const u8 *const gBattleScriptsForMoveEffects[]; @@ -1017,7 +1017,7 @@ static const u8 sHoldEffectToType[][2] = }; // percent in UQ_4_12 format -static const u16 sPercentToModifier[] = +static const uq4_12_t sPercentToModifier[] = { UQ_4_12(0.00), // 0 UQ_4_12(0.01), // 1 @@ -1124,7 +1124,7 @@ static const u16 sPercentToModifier[] = #define X UQ_4_12 -static const u16 sTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPES] = +static const uq4_12_t sTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPES] = { // normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark fairy {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(0.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // normal @@ -4108,11 +4108,11 @@ bool8 ChangeTypeBasedOnTerrain(u8 battlerId) // Supreme Overlord adds a damage boost for each fainted ally. // The first ally adds a x1.2 boost, and subsequent allies add an extra x0.1 boost each. -static u16 GetSupremeOverlordModifier(u8 battlerId) +static uq4_12_t GetSupremeOverlordModifier(u8 battlerId) { u32 i; struct Pokemon *party = GetBattlerParty(battlerId); - u16 modifier = UQ_4_12(1.0); + uq4_12_t modifier = UQ_4_12(1.0); bool8 appliedFirstBoost = FALSE; for (i = 0; i < PARTY_SIZE; i++) @@ -8297,16 +8297,6 @@ u32 GetMoveTargetCount(u16 move, u8 battlerAtk, u8 battlerDef) } } -void MulModifier(u16 *modifier, u16 val) -{ - *modifier = UQ_4_12_TO_INT((*modifier * val) + UQ_4_12_ROUND); -} - -static u32 ApplyModifier(u16 modifier, u32 val) -{ - return UQ_4_12_TO_INT((modifier * val) + UQ_4_12_ROUND); -} - static const u8 sFlailHpScaleToPowerTable[] = { 1, 200, @@ -8597,7 +8587,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) break; case EFFECT_EXPLOSION: if (move == MOVE_MISTY_EXPLOSION && gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && IsBattlerGrounded(battlerAtk)) - MulModifier(&basePower, UQ_4_12(1.5)); + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_DYNAMAX_DOUBLE_DMG: #ifdef B_DYNAMAX @@ -8623,7 +8613,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) } case EFFECT_GRAV_APPLE: if (gFieldStatuses & STATUS_FIELD_GRAVITY) - MulModifier(&basePower, UQ_4_12(1.5)); + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_TERRAIN_PULSE: if ((gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) @@ -8632,7 +8622,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) break; case EFFECT_EXPANDING_FORCE: if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) - MulModifier(&basePower, UQ_4_12(1.5)); + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_RISING_VOLTAGE: if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) @@ -8645,7 +8635,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) break; case EFFECT_PSYBLADE: if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) - MulModifier(&basePower, UQ_4_12(1.5)); + basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; } @@ -8668,8 +8658,8 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe u32 i; u32 holdEffectAtk, holdEffectParamAtk; u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef); - u16 holdEffectModifier; - u16 modifier = UQ_4_12(1.0); + uq4_12_t holdEffectModifier; + uq4_12_t modifier = UQ_4_12(1.0); u32 atkSide = GET_BATTLER_SIDE(battlerAtk); u16 atkAbility = GetBattlerAbility(battlerAtk); u16 defAbility = GetBattlerAbility(battlerDef); @@ -8679,135 +8669,135 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe { case ABILITY_TECHNICIAN: if (basePower <= 60) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_FLARE_BOOST: if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_TOXIC_BOOST: if (gBattleMons[battlerAtk].status1 & STATUS1_PSN_ANY && IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_RECKLESS: if (IS_MOVE_RECOIL(move)) - MulModifier(&modifier, UQ_4_12(1.2)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_IRON_FIST: if (gBattleMoves[move].punchingMove) - MulModifier(&modifier, UQ_4_12(1.2)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_SHEER_FORCE: if (gBattleMoves[move].sheerForceBoost) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_SAND_FORCE: if ((moveType == TYPE_STEEL || moveType == TYPE_ROCK || moveType == TYPE_GROUND) && gBattleWeather & B_WEATHER_SANDSTORM && WEATHER_HAS_EFFECT) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_RIVALRY: if (AreBattlersOfOppositeGender(battlerAtk, battlerDef)) - MulModifier(&modifier, UQ_4_12(1.25)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.25)); else - MulModifier(&modifier, UQ_4_12(0.75)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.75)); break; case ABILITY_ANALYTIC: if (GetBattlerTurnOrderNum(battlerAtk) == gBattlersCount - 1 && move != MOVE_FUTURE_SIGHT && move != MOVE_DOOM_DESIRE) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_TOUGH_CLAWS: if (IsMoveMakingContact(move, battlerAtk)) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_STRONG_JAW: if (gBattleMoves[move].bitingMove) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_MEGA_LAUNCHER: if (gBattleMoves[move].pulseMove) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_WATER_BUBBLE: if (moveType == TYPE_WATER) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case ABILITY_STEELWORKER: if (moveType == TYPE_STEEL) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_PIXILATE: if (moveType == TYPE_FAIRY && gBattleStruct->ateBoost[battlerAtk]) - MulModifier(&modifier, UQ_4_12(1.2)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_GALVANIZE: if (moveType == TYPE_ELECTRIC && gBattleStruct->ateBoost[battlerAtk]) - MulModifier(&modifier, UQ_4_12(1.2)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_REFRIGERATE: if (moveType == TYPE_ICE && gBattleStruct->ateBoost[battlerAtk]) - MulModifier(&modifier, UQ_4_12(1.2)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_AERILATE: if (moveType == TYPE_FLYING && gBattleStruct->ateBoost[battlerAtk]) - MulModifier(&modifier, UQ_4_12(1.2)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_NORMALIZE: if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk]) - MulModifier(&modifier, UQ_4_12(1.2)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_PUNK_ROCK: if (gBattleMoves[move].soundMove) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_STEELY_SPIRIT: if (moveType == TYPE_STEEL) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_TRANSISTOR: if (moveType == TYPE_ELECTRIC) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_DRAGONS_MAW: if (moveType == TYPE_DRAGON) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_GORILLA_TACTICS: if (IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_ROCKY_PAYLOAD: if (moveType == TYPE_ROCK) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_PROTOSYNTHESIS: { u8 atkHighestStat = GetHighestStatId(battlerAtk); if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && (atkHighestStat == STAT_ATK || atkHighestStat == STAT_SPATK)) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } break; case ABILITY_QUARK_DRIVE: { u8 atkHighestStat = GetHighestStatId(battlerAtk); if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && (atkHighestStat == STAT_ATK || atkHighestStat == STAT_SPATK)) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } break; case ABILITY_ORICHALCUM_PULSE: if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_HADRON_ENGINE: if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_SHARPNESS: if (gBattleMoves[move].slicingMove) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_SUPREME_OVERLORD: - MulModifier(&modifier, gBattleStruct->supremeOverlordModifier[battlerAtk]); + modifier = uq4_12_multiply(modifier, gBattleStruct->supremeOverlordModifier[battlerAtk]); break; } @@ -8816,22 +8806,22 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe || (IsAbilityOnField(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) { if (IsAbilityOnField(ABILITY_AURA_BREAK)) - MulModifier(&modifier, UQ_4_12(0.75)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.75)); else - MulModifier(&modifier, UQ_4_12(1.33)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.33)); } if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && atkAbility != ABILITY_VESSEL_OF_RUIN && IS_MOVE_SPECIAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.25)); if (IsAbilityOnField(ABILITY_SWORD_OF_RUIN) && defAbility != ABILITY_SWORD_OF_RUIN && IS_MOVE_PHYSICAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.25)); if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && atkAbility != ABILITY_TABLETS_OF_RUIN && IS_MOVE_PHYSICAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.25)); if (IsAbilityOnField(ABILITY_BEADS_OF_RUIN) && defAbility != ABILITY_BEADS_OF_RUIN && IS_MOVE_SPECIAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.25)); // attacker partner's abilities if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) @@ -8840,14 +8830,14 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe { case ABILITY_BATTERY: if (IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_POWER_SPOT: - MulModifier(&modifier, UQ_4_12(1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_STEELY_SPIRIT: if (moveType == TYPE_STEEL) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; } } @@ -8859,37 +8849,37 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe case ABILITY_WATER_BUBBLE: if (moveType == TYPE_FIRE) { - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); if (updateFlags) RecordAbilityBattle(battlerDef, defAbility); } break; case ABILITY_DRY_SKIN: if (moveType == TYPE_FIRE) - MulModifier(&modifier, UQ_4_12(1.25)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.25)); break; case ABILITY_FLUFFY: if (IsMoveMakingContact(move, battlerAtk)) { - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); if (updateFlags) RecordAbilityBattle(battlerDef, defAbility); } if (moveType == TYPE_FIRE) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && (defHighestStat == STAT_DEF || defHighestStat == STAT_SPDEF)) - MulModifier(&modifier, UQ_4_12(0.7)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; case ABILITY_QUARK_DRIVE: { u8 defHighestStat = GetHighestStatId(battlerDef); if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && (defHighestStat == STAT_DEF || defHighestStat == STAT_SPDEF)) - MulModifier(&modifier, UQ_4_12(0.7)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; } @@ -8906,23 +8896,23 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe { case HOLD_EFFECT_MUSCLE_BAND: if (IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_WISE_GLASSES: if (IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_LUSTROUS_ORB: if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PALKIA && (moveType == TYPE_WATER || moveType == TYPE_DRAGON)) - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_ADAMANT_ORB: if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_DIALGA && (moveType == TYPE_STEEL || moveType == TYPE_DRAGON)) - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_GRISEOUS_ORB: if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_GIRATINA && (moveType == TYPE_GHOST || moveType == TYPE_DRAGON)) - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_SOUL_DEW: #if B_SOUL_DEW_BOOST >= GEN_7 @@ -8930,11 +8920,11 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe #else if ((gBattleMons[battlerAtk].species == SPECIES_LATIAS || gBattleMons[battlerAtk].species == SPECIES_LATIOS) && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && IS_MOVE_SPECIAL(move)) #endif - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_GEMS: if (gSpecialStatuses[battlerAtk].gemBoost && gBattleMons[battlerAtk].item) - MulModifier(&modifier, UQ_4_12(1.0) + sPercentToModifier[gSpecialStatuses[battlerAtk].gemParam]); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.0) + sPercentToModifier[gSpecialStatuses[battlerAtk].gemParam]); break; case HOLD_EFFECT_BUG_POWER: case HOLD_EFFECT_STEEL_POWER: @@ -8959,18 +8949,18 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe if (holdEffectAtk == sHoldEffectToType[i][0]) { if (moveType == sHoldEffectToType[i][1]) - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; } } break; case HOLD_EFFECT_PLATE: if (moveType == ItemId_GetSecondaryId(gBattleMons[battlerAtk].item)) - MulModifier(&modifier, holdEffectModifier); + modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_PUNCHING_GLOVE: if (gBattleMoves[move].punchingMove) - MulModifier(&modifier, UQ_4_12(1.1)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); break; } @@ -8979,40 +8969,40 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe { case EFFECT_FACADE: if (gBattleMons[battlerAtk].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_PARALYSIS | STATUS1_FROSTBITE)) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_BRINE: if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2)) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_BARB_BARRAGE: case EFFECT_VENOSHOCK: if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: if (gSideTimers[atkSide].retaliateTimer == 1) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_SOLAR_BEAM: if (IsBattlerWeatherAffected(battlerAtk, (B_WEATHER_HAIL | B_WEATHER_SANDSTORM | B_WEATHER_RAIN | B_WEATHER_SNOW))) - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case EFFECT_STOMPING_TANTRUM: if (gBattleStruct->lastMoveFailed & gBitTable[battlerAtk]) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_BULLDOZE: case EFFECT_MAGNITUDE: case EFFECT_EARTHQUAKE: if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case EFFECT_KNOCK_OFF: #if B_KNOCK_OFF_DMG >= GEN_6 if (gBattleMons[battlerDef].item != ITEM_NONE && CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerDef].item)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); #endif break; } @@ -9025,19 +9015,19 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe // various effects if (gProtectStructs[battlerAtk].helpingHand) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (gStatuses3[battlerAtk] & STATUS3_ME_FIRST) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && moveType == TYPE_GRASS && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) - MulModifier(&modifier, TERRAIN_TYPE_BOOST); + modifier = uq4_12_multiply(modifier, TERRAIN_TYPE_BOOST); if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && moveType == TYPE_DRAGON && IsBattlerGrounded(battlerDef) && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && moveType == TYPE_ELECTRIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) - MulModifier(&modifier, TERRAIN_TYPE_BOOST); + modifier = uq4_12_multiply(modifier, TERRAIN_TYPE_BOOST); if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) - MulModifier(&modifier, TERRAIN_TYPE_BOOST); + modifier = uq4_12_multiply(modifier, TERRAIN_TYPE_BOOST); #if B_SPORT_TURNS >= GEN_6 if ((moveType == TYPE_ELECTRIC && gFieldStatuses & STATUS_FIELD_MUDSPORT) || (moveType == TYPE_FIRE && gFieldStatuses & STATUS_FIELD_WATERSPORT)) @@ -9046,9 +9036,9 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe || (moveType == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0))) #endif #if B_SPORT_DMG_REDUCTION >= GEN_5 - MulModifier(&modifier, UQ_4_12(0.23)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.23)); #else - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); #endif return ApplyModifier(modifier, basePower); } @@ -9058,7 +9048,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b { u8 atkStage; u32 atkStat; - u16 modifier; + uq4_12_t modifier; u16 atkBaseSpeciesId; atkBaseSpeciesId = GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species); @@ -9114,39 +9104,39 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b case ABILITY_HUGE_POWER: case ABILITY_PURE_POWER: if (IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case ABILITY_SLOW_START: if (gDisableStructs[battlerAtk].slowStartTimer != 0) - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case ABILITY_SOLAR_POWER: if (IS_MOVE_SPECIAL(move) && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_DEFEATIST: if (gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 2)) - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case ABILITY_FLASH_FIRE: if (moveType == TYPE_FIRE && gBattleResources->flags->flags[battlerAtk] & RESOURCE_FLAG_FLASH_FIRE) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_SWARM: if (moveType == TYPE_BUG && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_TORRENT: if (moveType == TYPE_WATER && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_BLAZE: if (moveType == TYPE_FIRE && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_OVERGROW: if (moveType == TYPE_GRASS && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; #if B_PLUS_MINUS_INTERACTION >= GEN_5 case ABILITY_PLUS: @@ -9155,34 +9145,34 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b { u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); if (partnerAbility == ABILITY_PLUS || partnerAbility == ABILITY_MINUS) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); } break; #else case ABILITY_PLUS: if (IS_MOVE_SPECIAL(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) && GetBattlerAbility(BATTLE_PARTNER(battlerAtk)) == ABILITY_MINUS) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_MINUS: if (IS_MOVE_SPECIAL(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) && GetBattlerAbility(BATTLE_PARTNER(battlerAtk)) == ABILITY_PLUS) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; #endif case ABILITY_FLOWER_GIFT: if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_HUSTLE: if (IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_STAKEOUT: if (gDisableStructs[battlerDef].isFirstTurn == 2) // just switched in - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case ABILITY_GUTS: if (gBattleMons[battlerAtk].status1 & STATUS1_ANY && IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; } @@ -9192,14 +9182,14 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b case ABILITY_THICK_FAT: if (moveType == TYPE_FIRE || moveType == TYPE_ICE) { - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); if (updateFlags) RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT); } break; case ABILITY_ICE_SCALES: if (IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, UQ_4_12(0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; } @@ -9210,7 +9200,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b { case ABILITY_FLOWER_GIFT: if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; } } @@ -9220,32 +9210,32 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b { case HOLD_EFFECT_THICK_CLUB: if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_DEEP_SEA_TOOTH: if (gBattleMons[battlerAtk].species == SPECIES_CLAMPERL && IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_LIGHT_BALL: if (atkBaseSpeciesId == SPECIES_PIKACHU) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_CHOICE_BAND: if (IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case HOLD_EFFECT_CHOICE_SPECS: if (IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; } // The offensive stats of a Player's PokΓ©mon are boosted by x1.1 (+10%) if they have the 1st badge and 7th badges. // Having the 1st badge boosts physical attack while having the 7th badge boosts special attack. if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerAtk) && IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.1)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerAtk) && IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, UQ_4_12(1.1)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); return ApplyModifier(modifier, atkStat); } @@ -9267,7 +9257,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 usesDefStat; u8 defStage; u32 defStat, def, spDef; - u16 modifier; + uq4_12_t modifier; if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped { @@ -9321,7 +9311,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, case ABILITY_MARVEL_SCALE: if (gBattleMons[battlerDef].status1 & STATUS1_ANY && usesDefStat) { - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); if (updateFlags) RecordAbilityBattle(battlerDef, ABILITY_MARVEL_SCALE); } @@ -9329,7 +9319,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, case ABILITY_FUR_COAT: if (usesDefStat) { - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (updateFlags) RecordAbilityBattle(battlerDef, ABILITY_FUR_COAT); } @@ -9337,22 +9327,22 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, case ABILITY_GRASS_PELT: if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) { - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); if (updateFlags) RecordAbilityBattle(battlerDef, ABILITY_GRASS_PELT); } break; case ABILITY_FLOWER_GIFT: if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_PUNK_ROCK: if (gBattleMoves[move].soundMove) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case ABILITY_PURIFYING_SALT: if (gBattleMoves[move].type == TYPE_GHOST) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; } @@ -9363,7 +9353,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, { case ABILITY_FLOWER_GIFT: if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), B_WEATHER_SUN) && !usesDefStat) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; } } @@ -9373,66 +9363,66 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, { case HOLD_EFFECT_DEEP_SEA_SCALE: if (gBattleMons[battlerDef].species == SPECIES_CLAMPERL && !usesDefStat) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_METAL_POWDER: if (gBattleMons[battlerDef].species == SPECIES_DITTO && usesDefStat && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) - MulModifier(&modifier, UQ_4_12(2.0)); + modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_EVIOLITE: if (CanEvolve(gBattleMons[battlerDef].species)) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case HOLD_EFFECT_ASSAULT_VEST: if (!usesDefStat) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; #if B_SOUL_DEW_BOOST <= GEN_6 case HOLD_EFFECT_SOUL_DEW: if ((gBattleMons[battlerDef].species == SPECIES_LATIAS || gBattleMons[battlerDef].species == SPECIES_LATIOS) && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && !usesDefStat) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; #endif } // sandstorm sp.def boost for rock types if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && gBattleWeather & B_WEATHER_SANDSTORM && WEATHER_HAS_EFFECT && !usesDefStat) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); // snow def boost for ice types if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && gBattleWeather & B_WEATHER_SNOW && WEATHER_HAS_EFFECT && usesDefStat) - MulModifier(&modifier, UQ_4_12(1.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); // The defensive stats of a Player's PokΓ©mon are boosted by x1.1 (+10%) if they have the 5th badge and 7th badges. // Having the 5th badge boosts physical defense while having the 7th badge boosts special defense. if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerDef) && IS_MOVE_PHYSICAL(move)) - MulModifier(&modifier, UQ_4_12(1.1)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerDef) && IS_MOVE_SPECIAL(move)) - MulModifier(&modifier, UQ_4_12(1.1)); + modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); return ApplyModifier(modifier, defStat); } -static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 typeEffectivenessModifier, bool32 isCrit, bool32 updateFlags) +static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, uq4_12_t typeEffectivenessModifier, bool32 isCrit, bool32 updateFlags) { u32 percentBoost; u32 abilityAtk = GetBattlerAbility(battlerAtk); u32 abilityDef = GetBattlerAbility(battlerDef); u32 defSide = GET_BATTLER_SIDE(battlerDef); - u16 finalModifier = UQ_4_12(1.0); + uq4_12_t finalModifier = UQ_4_12(1.0); u16 itemDef = gBattleMons[battlerDef].item; // check multiple targets in double battle if (GetMoveTargetCount(move, battlerAtk, battlerDef) >= 2) #if B_MULTIPLE_TARGETS_DMG >= GEN_4 - MulModifier(&finalModifier, UQ_4_12(0.75)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.75)); #else - MulModifier(&finalModifier, UQ_4_12(0.5)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.5)); #endif // take type effectiveness - MulModifier(&finalModifier, typeEffectivenessModifier); + finalModifier = uq4_12_multiply(finalModifier, typeEffectivenessModifier); // check crit if (isCrit) @@ -9478,9 +9468,9 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move if (IS_BATTLER_OF_TYPE(battlerAtk, moveType) && move != MOVE_STRUGGLE && move != MOVE_NONE) { if (abilityAtk == ABILITY_ADAPTABILITY) - MulModifier(&finalModifier, UQ_4_12(2.0)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(2.0)); else - MulModifier(&finalModifier, UQ_4_12(1.5)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.5)); } // reflect, light screen, aurora veil @@ -9492,24 +9482,24 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move && !gProtectStructs[battlerAtk].confusionSelfDmg) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - MulModifier(&finalModifier, UQ_4_12(0.66)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.66)); else - MulModifier(&finalModifier, UQ_4_12(0.5)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.5)); } // Parental Bond Second Strike if (gSpecialStatuses[battlerAtk].parentalBondState == PARENTAL_BOND_2ND_HIT) { if (B_PARENTAL_BOND_DMG < GEN_7) - MulModifier(&finalModifier, UQ_4_12(0.5)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.5)); else - MulModifier(&finalModifier, UQ_4_12(0.25)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.25)); } // Z-Moves and Max Moves bypass Protect and do 25% of their original damage if (gBattleStruct->zmove.active && IS_BATTLER_PROTECTED(battlerDef)) { - MulModifier(&finalModifier, UQ_4_12(0.25)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.25)); } // attacker's abilities @@ -9517,15 +9507,15 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move { case ABILITY_TINTED_LENS: if (typeEffectivenessModifier <= UQ_4_12(0.5)) - MulModifier(&finalModifier, UQ_4_12(2.0)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(2.0)); break; case ABILITY_SNIPER: if (isCrit) - MulModifier(&finalModifier, UQ_4_12(1.5)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.5)); break; case ABILITY_NEUROFORCE: if (typeEffectivenessModifier >= UQ_4_12(2.0)) - MulModifier(&finalModifier, UQ_4_12(1.25)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.25)); break; } @@ -9535,13 +9525,13 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move case ABILITY_MULTISCALE: case ABILITY_SHADOW_SHIELD: if (BATTLER_MAX_HP(battlerDef)) - MulModifier(&finalModifier, UQ_4_12(0.5)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.5)); break; case ABILITY_FILTER: case ABILITY_SOLID_ROCK: case ABILITY_PRISM_ARMOR: if (typeEffectivenessModifier >= UQ_4_12(2.0)) - MulModifier(&finalModifier, UQ_4_12(0.75)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.75)); break; } @@ -9551,7 +9541,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) { case ABILITY_FRIEND_GUARD: - MulModifier(&finalModifier, UQ_4_12(0.75)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.75)); break; } } @@ -9561,14 +9551,14 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move { case HOLD_EFFECT_METRONOME: percentBoost = min((gBattleStruct->sameMoveTurns[battlerAtk] * GetBattlerHoldEffectParam(battlerAtk)), 100); - MulModifier(&finalModifier, UQ_4_12(1.0) + sPercentToModifier[percentBoost]); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.0) + sPercentToModifier[percentBoost]); break; case HOLD_EFFECT_EXPERT_BELT: if (typeEffectivenessModifier >= UQ_4_12(2.0)) - MulModifier(&finalModifier, UQ_4_12(1.2)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.2)); break; case HOLD_EFFECT_LIFE_ORB: - MulModifier(&finalModifier, UQ_4_12(1.3)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.3)); break; } @@ -9582,9 +9572,9 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move && !UnnerveOn(battlerDef, itemDef)) { if (abilityDef == ABILITY_RIPEN) - MulModifier(&finalModifier, UQ_4_12(0.25)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.25)); else - MulModifier(&finalModifier, UQ_4_12(0.5)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(0.5)); if (updateFlags) gSpecialStatuses[battlerDef].berryReduced = TRUE; } @@ -9592,13 +9582,13 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } if (gBattleMoves[move].minimizeDoubleDamage && gStatuses3[battlerDef] & STATUS3_MINIMIZED) - MulModifier(&finalModifier, UQ_4_12(2.0)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(2.0)); if (gBattleMoves[move].damagesUnderground && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) - MulModifier(&finalModifier, UQ_4_12(2.0)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(2.0)); if (gBattleMoves[move].damagesUnderwater && gStatuses3[battlerDef] & STATUS3_UNDERWATER) - MulModifier(&finalModifier, UQ_4_12(2.0)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(2.0)); if (gBattleMoves[move].damagesAirborneDoubleDamage && gStatuses3[battlerDef] & STATUS3_ON_AIR) - MulModifier(&finalModifier, UQ_4_12(2.0)); + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(2.0)); dmg = ApplyModifier(finalModifier, dmg); if (dmg == 0) @@ -9608,7 +9598,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } static s32 DoMoveDamageCalc(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, - bool32 isCrit, bool32 randomFactor, bool32 updateFlags, u16 typeEffectivenessModifier) + bool32 isCrit, bool32 randomFactor, bool32 updateFlags, uq4_12_t typeEffectivenessModifier) { s32 dmg; @@ -9651,15 +9641,15 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 } // for AI - get move damage and effectiveness with one function call -s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 *typeEffectivenessModifier) +s32 CalculateMoveDamageAndEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, uq4_12_t *typeEffectivenessModifier) { *typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, FALSE); return DoMoveDamageCalc(move, battlerAtk, battlerDef, moveType, 0, FALSE, FALSE, FALSE, *typeEffectivenessModifier); } -static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 battlerAtk, bool32 recordAbilities) +static void MulByTypeEffectiveness(uq4_12_t *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 battlerAtk, bool32 recordAbilities) { - u16 mod = GetTypeModifier(moveType, defType); + uq4_12_t mod = GetTypeModifier(moveType, defType); if (mod == UQ_4_12(0.0) && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_RING_TARGET) { @@ -9694,13 +9684,13 @@ static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 batt mod = UQ_4_12(1.0); } - MulModifier(modifier, mod); + *modifier = uq4_12_multiply(*modifier, mod); } -static void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u16 resultingModifier, u32 illusionSpecies) +static void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, uq4_12_t resultingModifier, u32 illusionSpecies) { // Check if the type effectiveness would've been different if the pokemon really had the types as the disguise. - u16 presumedModifier = UQ_4_12(1.0); + uq4_12_t presumedModifier = UQ_4_12(1.0); MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, gSpeciesInfo[illusionSpecies].types[0], battlerAtk, FALSE); if (gSpeciesInfo[illusionSpecies].types[1] != gSpeciesInfo[illusionSpecies].types[0]) MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, gSpeciesInfo[illusionSpecies].types[1], battlerAtk, FALSE); @@ -9709,7 +9699,7 @@ static void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, u32 bat RecordAbilityBattle(battlerDef, ABILITY_ILLUSION); } -static void UpdateMoveResultFlags(u16 modifier) +static void UpdateMoveResultFlags(uq4_12_t modifier) { if (modifier == UQ_4_12(0.0)) { @@ -9732,7 +9722,7 @@ static void UpdateMoveResultFlags(u16 modifier) } } -static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities, u16 modifier) +static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities, uq4_12_t modifier) { u32 illusionSpecies; u16 defAbility = GetBattlerAbility(battlerDef); @@ -9805,9 +9795,9 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat return modifier; } -u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities) +uq4_12_t CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities) { - u16 modifier = UQ_4_12(1.0); + uq4_12_t modifier = UQ_4_12(1.0); if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { @@ -9821,9 +9811,9 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat return modifier; } -u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) { - u16 modifier = UQ_4_12(1.0); + uq4_12_t modifier = UQ_4_12(1.0); u8 moveType = gBattleMoves[move].type; if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) @@ -9842,7 +9832,7 @@ u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilit return modifier; } -static u16 GetInverseTypeMultiplier(u16 multiplier) +static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier) { switch (multiplier) { @@ -9857,7 +9847,7 @@ static u16 GetInverseTypeMultiplier(u16 multiplier) } } -u16 GetTypeModifier(u8 atkType, u8 defType) +uq4_12_t GetTypeModifier(u8 atkType, u8 defType) { #if B_FLAG_INVERSE_BATTLE != 0 if (FlagGet(B_FLAG_INVERSE_BATTLE)) @@ -9869,11 +9859,11 @@ u16 GetTypeModifier(u8 atkType, u8 defType) s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp) { s32 dmg = 0; - u16 modifier = UQ_4_12(1.0); + uq4_12_t modifier = UQ_4_12(1.0); - MulModifier(&modifier, GetTypeModifier(hazardType, type1)); + modifier = uq4_12_multiply(modifier, GetTypeModifier(hazardType, type1)); if (type2 != type1) - MulModifier(&modifier, GetTypeModifier(hazardType, type2)); + modifier = uq4_12_multiply(modifier, GetTypeModifier(hazardType, type2)); switch (modifier) { diff --git a/test/fpmath.c b/test/fpmath.c new file mode 100644 index 000000000..3f583d063 --- /dev/null +++ b/test/fpmath.c @@ -0,0 +1,18 @@ +#include "global.h" +#include "test.h" + +TEST("uq4_12_add adds 4.12 numbers") { + EXPECT_EQ(uq4_12_add(UQ_4_12(3.5), UQ_4_12(2.5)), UQ_4_12(6.0)); +} + +TEST("uq4_12_subtract subtracts 4.12 numbers") { + EXPECT_EQ(uq4_12_subtract(UQ_4_12(3.5), UQ_4_12(2.0)), UQ_4_12(1.5)); +} + +TEST("uq4_12_multiply multiplies 4.12 numbers") { + EXPECT_EQ(uq4_12_multiply(UQ_4_12(3.5), UQ_4_12(2.0)), UQ_4_12(7.0)); +} + +TEST("uq4_12_divide divides 4.12 numbers") { + EXPECT_EQ(uq4_12_divide(UQ_4_12(5.0), UQ_4_12(2.0)), UQ_4_12(2.5)); +} From adfc0af372f6b4f0d74ac32c9905d757ab46bd71 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 6 Jul 2023 22:17:21 -0400 Subject: [PATCH 024/111] Mon graphics are now loaded depending on their availability - If it has a female sprite/palette, it's loaded. - If it the species is enabled and it has a sprite/palette, it's loaded. - Otherwise, load the SPECIES_NONE graphics. --- .../question_mark/circled/anim_front.png | Bin 435 -> 410 bytes .../pokemon/question_mark/circled/back.png | Bin 423 -> 399 bytes include/constants/pokemon.h | 5 +- include/data.h | 2 +- include/pokemon.h | 3 +- include/pokemon_icon.h | 3 +- src/data/pokemon/species_info.h | 91 +-------- .../pokemon_graphics/back_pic_coordinates.h | 2 +- src/data/pokemon_graphics/back_pic_table.h | 4 +- .../pokemon_graphics/enemy_mon_elevation.h | 2 +- src/data/pokemon_graphics/footprint_table.h | 2 +- src/data/pokemon_graphics/front_pic_anims.h | 2 +- .../pokemon_graphics/front_pic_coordinates.h | 2 +- src/data/pokemon_graphics/front_pic_table.h | 9 +- src/data/pokemon_graphics/palette_table.h | 80 +------- .../pokemon_graphics/shiny_palette_table.h | 80 +------- src/decompress.c | 45 ++--- src/field_effect.c | 2 +- src/pokemon.c | 52 ++++-- src/pokemon_debug.c | 34 ++-- src/pokemon_icon.c | 173 ++---------------- src/pokemon_storage_system.c | 4 +- 22 files changed, 125 insertions(+), 472 deletions(-) diff --git a/graphics/pokemon/question_mark/circled/anim_front.png b/graphics/pokemon/question_mark/circled/anim_front.png index a998f7849e1bf3e0b7a867eb8d15cc3f025b7ea7..adc8ca4a04236d7b7a4c5f3b1e6360625ea15df3 100644 GIT binary patch delta 345 zcmdnYJd1gP3Wq^}Pl)TBvu7t7%1`v;tB-Sc6=7gt5GV=q3ugF_3JwHxJ2Nmaa(cQr zhGaCpo#rjnqQK*lI=|xom*Nu+jY{KOJ=wH-zMmk)-kQ?lzL^bdH5_nDHd z_z&L7ntVN^CRc~SUU=OvU6$9YzUzOplvPuVu-1MMzQ*9Z!+f5SdCvK2Pfspr`!J6= zrEc04%UkOgIIgTZ{inHc_MU#W3JDh85(ABl4|W|^C9C$?%y!#9;T?gTe~DWM4fR$ZI} delta 373 zcmV-*0gC>b1G58=BnvZ8OjJb?5fPlt&5j@23`FMwX}SMt$3lpSSQ3oOej6#In*ibS`w>EB2ucO=O5W7XBPU% zHWq+i30I9s0KI?F&*3l$LECA;enkuO5#Y`M^D*>hQtk|D2+w0MBR@)Tj`}NTP^w%~00000NkvXXu0mjfxG0+l diff --git a/graphics/pokemon/question_mark/circled/back.png b/graphics/pokemon/question_mark/circled/back.png index 4769ad6807813d33f238ddc9b7394e873846ee85..1b944339669cc22e284965c391a8d6041a6e86bd 100644 GIT binary patch delta 334 zcmZ3^+|N8gh1DRyC&YE4q5MP#)`0^A>7R;BiTv|Lx!Lxsok61W&VUmZ?&1{i6JEf3CN;_dJ%RT%S(eyVE;y^Lb^q z-zrXjC#*N{eet$DH2utvlYSjL>g7dL8~z3zWhs}rQLndzlj&z=J=aP#0fydN+w&J1 zes#XEE#up)uC=|a3F(JI>{}Pae*Nca&wh~8@pfk8{za_z%y$?cJijp8b0_l^fqBIX z&h!iM1lF@MF8yWtS)9SRQlGI#f`w6np_TD`bH~Eq8=K5~%M@cpBRtA9%_kpH+I=!_ z*|n8(>gw&YId(85-L|Y>u*9N&%b$g_?5=$l_x_i4I)2^H*S7x;>~L0z_x${A{-pDJ emM;B&iCxrPetF1s)6>APVDNPHb6Mw<&;$U+mYnAR delta 361 zcmV-v0ha!c1E&L!BnvZ8OjJbx005lL&5jheIM2U0004WQchC zOA>@23`D&^TJC?^u@GVhED6Tl&>JbF9|6K=+m@D=MiQhf$SZqs7e>rJkLc`^2=zk_ zVVY3e@2Y>wnDLXH5PtvO$x8tHC5s7|@n4BFK_EXbA=NknpjkWm7Mjy>2-+6Ko`+&< zeF4~&FxBt`Q2Q7CoP+-#=OsWj^W|8{18Z#%~i zl<<)jKUBlVdi-LEUv2TrHGaLv9~ki`&IgaI51x5TOaG-G?x;$0o*_w700000NkvXX Hu0mjfK4X-a diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 72dd6e7bd..af7178041 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -325,9 +325,8 @@ #define SPECIES_FLAG_ALOLAN_FORM (1 << 5) #define SPECIES_FLAG_GALARIAN_FORM (1 << 6) #define SPECIES_FLAG_HISUIAN_FORM (1 << 7) -#define SPECIES_FLAG_GENDER_DIFFERENCE (1 << 8) -#define SPECIES_FLAG_ALL_PERFECT_IVS (1 << 9) -#define SPECIES_FLAG_CANNOT_BE_TRADED (1 << 10) +#define SPECIES_FLAG_ALL_PERFECT_IVS (1 << 8) +#define SPECIES_FLAG_CANNOT_BE_TRADED (1 << 9) #define LEGENDARY_PERFECT_IV_COUNT 3 diff --git a/include/data.h b/include/data.h index 6e41ac703..5bf555e28 100644 --- a/include/data.h +++ b/include/data.h @@ -153,7 +153,7 @@ extern const struct MonCoords gTrainerBackPicCoords[]; extern const struct CompressedSpriteSheet gTrainerBackPicTable[]; // functionally unused extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; -extern const u8 gEnemyMonElevation[NUM_SPECIES]; +extern const u8 gEnemyMonElevation[NUM_SPECIES + 1]; extern const union AnimCmd *const *const gMonFrontAnimsPtrTable[]; extern const struct CompressedSpriteSheet gMonFrontPicTable[]; diff --git a/include/pokemon.h b/include/pokemon.h index 022c155ae..6ca07fbcf 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -494,6 +494,7 @@ u8 GetDefaultMoveTarget(u8 battlerId); u8 GetMonGender(struct Pokemon *mon); u8 GetBoxMonGender(struct BoxPokemon *boxMon); u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality); +bool32 IsPersonalityFemale(u16 species, u32 personality); u32 GetUnownSpeciesId(u32 personality); void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition); void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition); @@ -606,7 +607,7 @@ u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg); u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 arg); bool32 DoesSpeciesHaveFormChangeMethod(u16 species, u16 method); u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove); -bool32 ShouldShowFemaleDifferences(u16 species, u32 personality); +bool32 SpeciesHasGenderDifferences(u16 species); bool32 TryFormChange(u32 monId, u32 side, u16 method); void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method); u32 GetMonFriendshipScore(struct Pokemon *pokemon); diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h index 6e27689f9..08e905fef 100644 --- a/include/pokemon_icon.h +++ b/include/pokemon_icon.h @@ -3,7 +3,8 @@ extern const u8 gMonIconPaletteIndices[]; extern const u8 gMonIconPaletteIndicesFemale[]; -extern const u8 *const gMonIconTable[]; +extern const u8 *const gMonIconTable[NUM_SPECIES + 1]; +extern const u8 *const gMonIconTableFemale[NUM_SPECIES + 1]; extern const struct SpritePalette gMonIconPaletteTable[]; const u8 *GetMonIconTiles(u16 species, u32 personality); diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index f2b9eb9cc..37028623b 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -17,6 +17,7 @@ #endif #define PIKACHU_SPECIES_INFO(gender, flip) \ + { \ .baseHP = 35, \ .baseAttack = 55, \ .baseSpeed = 90, \ @@ -34,10 +35,11 @@ .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, \ .abilities = {ABILITY_STATIC, ABILITY_NONE, ABILITY_LIGHTNING_ROD},\ .bodyColor = BODY_COLOR_YELLOW, \ - .noFlip = flip + .noFlip = flip, \ + } -#define COSPLAY_PIKACHU_SPECIES_INFO(flip) { PIKACHU_SPECIES_INFO(MON_FEMALE, flip), } -#define CAP_PIKACHU_SPECIES_INFO(flip) { PIKACHU_SPECIES_INFO(MON_MALE, flip), } +#define COSPLAY_PIKACHU_SPECIES_INFO(flip) PIKACHU_SPECIES_INFO(MON_FEMALE, flip) +#define CAP_PIKACHU_SPECIES_INFO(flip) PIKACHU_SPECIES_INFO(MON_MALE, flip) #define PICHU_SPECIES_INFO(flip) \ { \ @@ -905,7 +907,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_OVERGROW, ABILITY_NONE, ABILITY_CHLOROPHYLL}, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_CHARMANDER] = @@ -1112,7 +1113,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE, ABILITY_TINTED_LENS}, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_WEEDLE] = @@ -1277,7 +1277,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RUN_AWAY, ABILITY_GUTS, ABILITY_HUSTLE}, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_RATICATE] = @@ -1300,7 +1299,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RUN_AWAY, ABILITY_GUTS, ABILITY_HUSTLE}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SPEAROW] = @@ -1397,11 +1395,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, - [SPECIES_PIKACHU] = - { - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, - PIKACHU_SPECIES_INFO(PERCENT_FEMALE(50), FLIP), - }, + [SPECIES_PIKACHU] = PIKACHU_SPECIES_INFO(PERCENT_FEMALE(50), FLIP), [SPECIES_RAICHU] = { @@ -1427,7 +1421,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_STATIC, ABILITY_NONE, ABILITY_LIGHTNING_ROD}, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SANDSHREW] = @@ -1799,7 +1792,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE, ABILITY_INFILTRATOR}, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_GOLBAT] = @@ -1822,7 +1814,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE, ABILITY_INFILTRATOR}, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_ODDISH] = @@ -1869,7 +1860,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_STENCH}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_VILEPLUME] = @@ -1897,7 +1887,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_EFFECT_SPORE}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_PARAS] = @@ -2339,7 +2328,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS, ABILITY_MAGIC_GUARD}, .bodyColor = BODY_COLOR_BROWN, .noFlip = TRUE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_ALAKAZAM] = @@ -2367,7 +2355,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS, ABILITY_MAGIC_GUARD}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_MACHOP] = @@ -2812,7 +2799,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD, ABILITY_TANGLED_FEET}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_DODRIO] = @@ -2840,7 +2826,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD, ABILITY_TANGLED_FEET}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SEEL] = @@ -3116,7 +3101,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INSOMNIA, ABILITY_FOREWARN, ABILITY_INNER_FOCUS}, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_KRABBY] = @@ -3439,7 +3423,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD, ABILITY_RECKLESS}, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_RHYDON] = @@ -3462,7 +3445,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD, ABILITY_RECKLESS}, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_CHANSEY] = @@ -3600,7 +3582,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL, ABILITY_LIGHTNING_ROD}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SEAKING] = @@ -3624,7 +3605,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL, ABILITY_LIGHTNING_ROD}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_STARYU] = @@ -3721,7 +3701,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWARM, ABILITY_TECHNICIAN, ABILITY_STEADFAST}, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_JYNX] = @@ -3857,7 +3836,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE, ABILITY_RATTLED}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_GYARADOS] = @@ -3880,7 +3858,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE, ABILITY_MOXIE}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_LAPRAS] = @@ -3951,7 +3928,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RUN_AWAY, ABILITY_ADAPTABILITY, ABILITY_ANTICIPATION}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_VAPOREON] = @@ -4432,7 +4408,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_OVERGROW, ABILITY_NONE, ABILITY_LEAF_GUARD}, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_CYNDAQUIL] = @@ -4682,7 +4657,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWARM, ABILITY_EARLY_BIRD, ABILITY_RATTLED}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_LEDIAN] = @@ -4705,7 +4679,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWARM, ABILITY_EARLY_BIRD, ABILITY_IRON_FIST}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SPINARAK] = @@ -4974,7 +4947,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SYNCHRONIZE, ABILITY_EARLY_BIRD, ABILITY_MAGIC_BOUNCE}, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_MAREEP] = @@ -5150,7 +5122,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD, ABILITY_RATTLED}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_POLITOED] = @@ -5174,7 +5145,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP, ABILITY_DRIZZLE}, .bodyColor = BODY_COLOR_GREEN, .noFlip = TRUE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_HOPPIP] = @@ -5267,7 +5237,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RUN_AWAY, ABILITY_PICKUP, ABILITY_SKILL_LINK}, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SUNKERN] = @@ -5357,7 +5326,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_DAMP, ABILITY_WATER_ABSORB, ABILITY_UNAWARE}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_QUAGSIRE] = @@ -5380,7 +5348,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_DAMP, ABILITY_WATER_ABSORB, ABILITY_UNAWARE}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_ESPEON] = @@ -5447,7 +5414,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INSOMNIA, ABILITY_SUPER_LUCK, ABILITY_PRANKSTER}, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SLOWKING] = @@ -5517,7 +5483,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SHADOW_TAG, ABILITY_NONE, ABILITY_TELEPATHY}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_GIRAFARIG] = @@ -5540,7 +5505,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INNER_FOCUS, ABILITY_EARLY_BIRD, ABILITY_SAP_SIPPER}, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_PINECO] = @@ -5629,7 +5593,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SAND_VEIL, ABILITY_IMMUNITY}, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_STEELIX] = @@ -5653,7 +5616,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY, ABILITY_SHEER_FORCE}, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SNUBBULL] = @@ -5755,7 +5717,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWARM, ABILITY_TECHNICIAN, ABILITY_LIGHT_METAL}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SHUCKLE] = @@ -5803,7 +5764,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWARM, ABILITY_GUTS, ABILITY_MOXIE}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SNEASEL] = @@ -5827,7 +5787,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INNER_FOCUS, ABILITY_KEEN_EYE, ABILITY_PICKPOCKET}, .bodyColor = BODY_COLOR_BLACK, .noFlip = TRUE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_TEDDIURSA] = @@ -5872,7 +5831,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_GUTS, ABILITY_QUICK_FEET, ABILITY_UNNERVE}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SLUGMA] = @@ -5967,7 +5925,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_OBLIVIOUS, ABILITY_SNOW_CLOAK, ABILITY_THICK_FAT}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_CORSOLA] = @@ -6043,7 +6000,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SUCTION_CUPS, ABILITY_SNIPER, ABILITY_MOODY}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_DELIBIRD] = @@ -6159,7 +6115,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_EARLY_BIRD, ABILITY_FLASH_FIRE, ABILITY_UNNERVE}, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_KINGDRA] = @@ -6230,7 +6185,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_STURDY, ABILITY_NONE, ABILITY_SAND_VEIL}, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_PORYGON2] = @@ -6767,7 +6721,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_BLAZE, ABILITY_NONE, ABILITY_SPEED_BOOST}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_COMBUSKEN] = @@ -6791,7 +6744,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_BLAZE, ABILITY_NONE, ABILITY_SPEED_BOOST}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_BLAZIKEN] = @@ -6814,7 +6766,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_BLAZE, ABILITY_NONE, ABILITY_SPEED_BOOST}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_MUDKIP] = @@ -7046,7 +6997,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWARM, ABILITY_NONE, ABILITY_RIVALRY}, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_CASCOON] = @@ -7092,7 +7042,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE, ABILITY_COMPOUND_EYES}, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_LOTAD] = @@ -7162,7 +7111,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH, ABILITY_OWN_TEMPO}, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SEEDOT] = @@ -7209,7 +7157,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD, ABILITY_PICKPOCKET}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SHIFTRY] = @@ -7233,7 +7180,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD, ABILITY_PICKPOCKET}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_TAILLOW] = @@ -8012,7 +7958,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_PURE_POWER, ABILITY_NONE, ABILITY_TELEPATHY}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_MEDICHAM] = @@ -8035,7 +7980,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_PURE_POWER, ABILITY_NONE, ABILITY_TELEPATHY}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_ELECTRIKE] = @@ -10062,7 +10006,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE, ABILITY_RECKLESS}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_STARAVIA] = @@ -10085,7 +10028,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE, ABILITY_RECKLESS}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_STARAPTOR] = @@ -10134,7 +10076,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SIMPLE, ABILITY_UNAWARE, ABILITY_MOODY}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_BIBAREL] = @@ -10180,7 +10121,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE, ABILITY_RUN_AWAY}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_KRICKETUNE] = @@ -10204,7 +10144,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SWARM, ABILITY_NONE, ABILITY_TECHNICIAN}, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SHINX] = @@ -10227,7 +10166,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RIVALRY, ABILITY_INTIMIDATE, ABILITY_GUTS}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_LUXIO] = @@ -10482,7 +10420,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_HONEY_GATHER, ABILITY_NONE, ABILITY_HUSTLE}, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_VESPIQUEN] = @@ -10624,7 +10561,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_TECHNICIAN, ABILITY_PICKUP, ABILITY_SKILL_LINK}, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_DRIFLOON] = @@ -11055,7 +10991,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE, ABILITY_ROUGH_SKIN}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_GABITE] = @@ -11078,7 +11013,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE, ABILITY_ROUGH_SKIN}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_GARCHOMP] = @@ -11101,7 +11035,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE, ABILITY_ROUGH_SKIN}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_MUNCHLAX] = @@ -11193,7 +11126,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SAND_STREAM, ABILITY_NONE, ABILITY_SAND_FORCE}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_HIPPOWDON] = @@ -11216,7 +11148,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_SAND_STREAM, ABILITY_NONE, ABILITY_SAND_FORCE}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_SKORUPI] = @@ -11468,7 +11399,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_PRESSURE, ABILITY_NONE, ABILITY_PICKPOCKET}, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_MAGNEZONE] = @@ -11537,7 +11467,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_LIGHTNING_ROD, ABILITY_SOLID_ROCK, ABILITY_RECKLESS}, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_TANGROWTH] = @@ -11560,7 +11489,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_CHLOROPHYLL, ABILITY_LEAF_GUARD, ABILITY_REGENERATOR}, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_ELECTIVIRE] = @@ -11745,7 +11673,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_OBLIVIOUS, ABILITY_SNOW_CLOAK, ABILITY_THICK_FAT}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_PORYGON_Z] = @@ -12843,7 +12770,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_BIG_PECKS, ABILITY_SUPER_LUCK, ABILITY_RIVALRY}, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_BLITZLE] = @@ -14457,7 +14383,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_WATER_ABSORB, ABILITY_CURSED_BODY, ABILITY_DAMP}, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_JELLICENT] = @@ -14480,7 +14405,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_WATER_ABSORB, ABILITY_CURSED_BODY, ABILITY_DAMP}, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_ALOMOMOLA] = @@ -16140,7 +16064,6 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_RIVALRY, ABILITY_UNNERVE, ABILITY_MOXIE}, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, - .flags = SPECIES_FLAG_GENDER_DIFFERENCE, }, [SPECIES_FLABEBE] = FLABEBE_SPECIES_INFO, @@ -23319,7 +23242,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .abilities = {ABILITY_INNER_FOCUS, ABILITY_KEEN_EYE, ABILITY_POISON_TOUCH}, .bodyColor = BODY_COLOR_BLACK, .noFlip = TRUE, - .flags = SPECIES_FLAG_HISUIAN_FORM | SPECIES_FLAG_GENDER_DIFFERENCE, + .flags = SPECIES_FLAG_HISUIAN_FORM, }, #if P_GEN_5_POKEMON == TRUE diff --git a/src/data/pokemon_graphics/back_pic_coordinates.h b/src/data/pokemon_graphics/back_pic_coordinates.h index 268975d58..c849eaf2f 100644 --- a/src/data/pokemon_graphics/back_pic_coordinates.h +++ b/src/data/pokemon_graphics/back_pic_coordinates.h @@ -21,7 +21,7 @@ // the sprite's non-transparent pixels actually are. // .size is the dimensions of this drawn pixel area. // .y_offset is the number of pixels between the drawn pixel area and the bottom edge. -const struct MonCoords gMonBackPicCoords[] = +const struct MonCoords gMonBackPicCoords[NUM_SPECIES + 1] = { [SPECIES_NONE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, [SPECIES_BULBASAUR] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13 }, diff --git a/src/data/pokemon_graphics/back_pic_table.h b/src/data/pokemon_graphics/back_pic_table.h index b73dd70d0..7ade79952 100644 --- a/src/data/pokemon_graphics/back_pic_table.h +++ b/src/data/pokemon_graphics/back_pic_table.h @@ -1,4 +1,4 @@ -const struct CompressedSpriteSheet gMonBackPicTable[] = +const struct CompressedSpriteSheet gMonBackPicTable[NUM_SPECIES + 1] = { SPECIES_SPRITE(NONE, gMonBackPic_CircledQuestionMark), SPECIES_SPRITE(BULBASAUR, gMonBackPic_Bulbasaur), @@ -1338,7 +1338,7 @@ const struct CompressedSpriteSheet gMonBackPicTable[] = SPECIES_SPRITE(EGG, gMonFrontPic_Egg), }; -const struct CompressedSpriteSheet gMonBackPicTableFemale[] = +const struct CompressedSpriteSheet gMonBackPicTableFemale[NUM_SPECIES + 1] = { SPECIES_SPRITE(VENUSAUR, gMonBackPic_VenusaurF), SPECIES_SPRITE(BUTTERFREE, gMonBackPic_ButterfreeF), diff --git a/src/data/pokemon_graphics/enemy_mon_elevation.h b/src/data/pokemon_graphics/enemy_mon_elevation.h index 64bd433fa..9471451ea 100644 --- a/src/data/pokemon_graphics/enemy_mon_elevation.h +++ b/src/data/pokemon_graphics/enemy_mon_elevation.h @@ -1,6 +1,6 @@ // This determines how much higher above the usual position the enemy PokΓ©mon // is during battle. Species that float or fly have nonzero values. -const u8 gEnemyMonElevation[NUM_SPECIES] = +const u8 gEnemyMonElevation[NUM_SPECIES + 1] = { [SPECIES_BUTTERFREE] = 10, [SPECIES_BEEDRILL] = 9, diff --git a/src/data/pokemon_graphics/footprint_table.h b/src/data/pokemon_graphics/footprint_table.h index 8e21b0604..38737ac43 100644 --- a/src/data/pokemon_graphics/footprint_table.h +++ b/src/data/pokemon_graphics/footprint_table.h @@ -1,4 +1,4 @@ -const u8 *const gMonFootprintTable[] = +const u8 *const gMonFootprintTable[NUM_SPECIES + 1] = { [SPECIES_NONE] = gMonFootprint_Bulbasaur, [SPECIES_BULBASAUR] = gMonFootprint_Bulbasaur, diff --git a/src/data/pokemon_graphics/front_pic_anims.h b/src/data/pokemon_graphics/front_pic_anims.h index f8f0bb119..d30dc4266 100644 --- a/src/data/pokemon_graphics/front_pic_anims.h +++ b/src/data/pokemon_graphics/front_pic_anims.h @@ -11665,7 +11665,7 @@ SINGLE_ANIMATION(LycanrocDusk); SINGLE_ANIMATION(EnamorusTherian); #endif -const union AnimCmd *const *const gMonFrontAnimsPtrTable[] = +const union AnimCmd *const *const gMonFrontAnimsPtrTable[NUM_SPECIES + 1] = { [SPECIES_NONE] = sAnims_None, [SPECIES_BULBASAUR] = sAnims_Bulbasaur, diff --git a/src/data/pokemon_graphics/front_pic_coordinates.h b/src/data/pokemon_graphics/front_pic_coordinates.h index ea158229c..eb2786fde 100644 --- a/src/data/pokemon_graphics/front_pic_coordinates.h +++ b/src/data/pokemon_graphics/front_pic_coordinates.h @@ -2,7 +2,7 @@ // the sprite's non-transparent pixels actually are. // .size is the dimensions of this drawn pixel area. // .y_offset is the number of pixels between the drawn pixel area and the bottom edge. -const struct MonCoords gMonFrontPicCoords[] = +const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = { [SPECIES_NONE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, [SPECIES_BULBASAUR] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 13 }, diff --git a/src/data/pokemon_graphics/front_pic_table.h b/src/data/pokemon_graphics/front_pic_table.h index adb60c0b6..8ef0d34c3 100644 --- a/src/data/pokemon_graphics/front_pic_table.h +++ b/src/data/pokemon_graphics/front_pic_table.h @@ -1,4 +1,4 @@ -const struct CompressedSpriteSheet gMonFrontPicTable[] = +const struct CompressedSpriteSheet gMonFrontPicTable[NUM_SPECIES + 1] = { SPECIES_SPRITE(NONE, gMonFrontPic_CircledQuestionMark), SPECIES_SPRITE(BULBASAUR, gMonFrontPic_Bulbasaur), @@ -1337,7 +1337,7 @@ const struct CompressedSpriteSheet gMonFrontPicTable[] = SPECIES_SPRITE(EGG, gMonFrontPic_Egg), }; -const struct CompressedSpriteSheet gMonFrontPicTableFemale[] = +const struct CompressedSpriteSheet gMonFrontPicTableFemale[NUM_SPECIES + 1] = { SPECIES_SPRITE(VENUSAUR, gMonFrontPic_VenusaurF), SPECIES_SPRITE(BUTTERFREE, gMonFrontPic_ButterfreeF), @@ -1394,7 +1394,6 @@ const struct CompressedSpriteSheet gMonFrontPicTableFemale[] = SPECIES_SPRITE(SHIFTRY, gMonFrontPic_ShiftryF), SPECIES_SPRITE(MEDITITE, gMonFrontPic_MedititeF), SPECIES_SPRITE(MEDICHAM, gMonFrontPic_MedichamF), - #if P_GEN_4_POKEMON == TRUE SPECIES_SPRITE(STARLY, gMonFrontPic_StarlyF), SPECIES_SPRITE(STARAVIA, gMonFrontPic_StaraviaF), @@ -1403,13 +1402,10 @@ const struct CompressedSpriteSheet gMonFrontPicTableFemale[] = SPECIES_SPRITE(KRICKETOT, gMonFrontPic_KricketotF), SPECIES_SPRITE(KRICKETUNE, gMonFrontPic_KricketuneF), SPECIES_SPRITE(SHINX, gMonFrontPic_ShinxF), - SPECIES_SPRITE(COMBEE, gMonFrontPic_Combee), SPECIES_SPRITE(AMBIPOM, gMonFrontPic_AmbipomF), SPECIES_SPRITE(GIBLE, gMonFrontPic_GibleF), SPECIES_SPRITE(GABITE, gMonFrontPic_GabiteF), SPECIES_SPRITE(GARCHOMP, gMonFrontPic_GarchompF), - SPECIES_SPRITE(HIPPOPOTAS, gMonFrontPic_Hippopotas), - SPECIES_SPRITE(HIPPOWDON, gMonFrontPic_Hippowdon), SPECIES_SPRITE(WEAVILE, gMonFrontPic_WeavileF), SPECIES_SPRITE(RHYPERIOR, gMonFrontPic_RhyperiorF), SPECIES_SPRITE(TANGROWTH, gMonFrontPic_TangrowthF), @@ -1423,6 +1419,5 @@ const struct CompressedSpriteSheet gMonFrontPicTableFemale[] = #if P_GEN_6_POKEMON == TRUE SPECIES_SPRITE(PYROAR, gMonFrontPic_PyroarF), #endif - SPECIES_SPRITE(SNEASEL_HISUIAN, gMonFrontPic_SneaselHisuianF), }; diff --git a/src/data/pokemon_graphics/palette_table.h b/src/data/pokemon_graphics/palette_table.h index fd2a05474..1fa65f3b3 100644 --- a/src/data/pokemon_graphics/palette_table.h +++ b/src/data/pokemon_graphics/palette_table.h @@ -1,4 +1,4 @@ -const struct CompressedSpritePalette gMonPaletteTable[] = +const struct CompressedSpritePalette gMonPaletteTable[NUM_SPECIES + 1] = { SPECIES_PAL(NONE, gMonPalette_CircledQuestionMark), SPECIES_PAL(BULBASAUR, gMonPalette_Bulbasaur), @@ -1336,92 +1336,16 @@ const struct CompressedSpritePalette gMonPaletteTable[] = SPECIES_PAL(EGG, gMonPalette_Egg), }; -const struct CompressedSpritePalette gMonPaletteTableFemale[] = +const struct CompressedSpritePalette gMonPaletteTableFemale[NUM_SPECIES + 1] = { - SPECIES_PAL(VENUSAUR, gMonPalette_Venusaur), - SPECIES_PAL(BUTTERFREE, gMonPalette_Butterfree), - SPECIES_PAL(RATTATA, gMonPalette_Rattata), - SPECIES_PAL(RATICATE, gMonPalette_Raticate), - SPECIES_PAL(PIKACHU, gMonPalette_Pikachu), - SPECIES_PAL(RAICHU, gMonPalette_Raichu), - SPECIES_PAL(ZUBAT, gMonPalette_Zubat), - SPECIES_PAL(GOLBAT, gMonPalette_Golbat), - SPECIES_PAL(GLOOM, gMonPalette_Gloom), - SPECIES_PAL(VILEPLUME, gMonPalette_Vileplume), - SPECIES_PAL(KADABRA, gMonPalette_Kadabra), - SPECIES_PAL(ALAKAZAM, gMonPalette_Alakazam), - SPECIES_PAL(DODUO, gMonPalette_Doduo), - SPECIES_PAL(DODRIO, gMonPalette_Dodrio), - SPECIES_PAL(HYPNO, gMonPalette_Hypno), - SPECIES_PAL(RHYHORN, gMonPalette_Rhyhorn), - SPECIES_PAL(RHYDON, gMonPalette_Rhydon), - SPECIES_PAL(GOLDEEN, gMonPalette_Goldeen), - SPECIES_PAL(SEAKING, gMonPalette_Seaking), - SPECIES_PAL(SCYTHER, gMonPalette_Scyther), - SPECIES_PAL(MAGIKARP, gMonPalette_Magikarp), - SPECIES_PAL(GYARADOS, gMonPalette_Gyarados), - SPECIES_PAL(EEVEE, gMonPalette_Eevee), - SPECIES_PAL(MEGANIUM, gMonPalette_Meganium), - SPECIES_PAL(LEDYBA, gMonPalette_Ledyba), - SPECIES_PAL(LEDIAN, gMonPalette_Ledian), - SPECIES_PAL(XATU, gMonPalette_Xatu), - SPECIES_PAL(SUDOWOODO, gMonPalette_Sudowoodo), - SPECIES_PAL(POLITOED, gMonPalette_Politoed), - SPECIES_PAL(AIPOM, gMonPalette_Aipom), - SPECIES_PAL(WOOPER, gMonPalette_Wooper), - SPECIES_PAL(QUAGSIRE, gMonPalette_Quagsire), - SPECIES_PAL(MURKROW, gMonPalette_Murkrow), - SPECIES_PAL(WOBBUFFET, gMonPalette_Wobbuffet), - SPECIES_PAL(GIRAFARIG, gMonPalette_Girafarig), - SPECIES_PAL(GLIGAR, gMonPalette_Gligar), - SPECIES_PAL(STEELIX, gMonPalette_Steelix), - SPECIES_PAL(SCIZOR, gMonPalette_Scizor), - SPECIES_PAL(HERACROSS, gMonPalette_Heracross), - SPECIES_PAL(SNEASEL, gMonPalette_Sneasel), - SPECIES_PAL(URSARING, gMonPalette_Ursaring), - SPECIES_PAL(PILOSWINE, gMonPalette_Piloswine), - SPECIES_PAL(OCTILLERY, gMonPalette_Octillery), - SPECIES_PAL(HOUNDOOM, gMonPalette_Houndoom), - SPECIES_PAL(DONPHAN, gMonPalette_Donphan), - SPECIES_PAL(TORCHIC, gMonPalette_Torchic), - SPECIES_PAL(COMBUSKEN, gMonPalette_Combusken), - SPECIES_PAL(BLAZIKEN, gMonPalette_Blaziken), - SPECIES_PAL(BEAUTIFLY, gMonPalette_Beautifly), - SPECIES_PAL(DUSTOX, gMonPalette_Dustox), - SPECIES_PAL(LUDICOLO, gMonPalette_Ludicolo), - SPECIES_PAL(NUZLEAF, gMonPalette_Nuzleaf), - SPECIES_PAL(SHIFTRY, gMonPalette_Shiftry), - SPECIES_PAL(MEDITITE, gMonPalette_Meditite), - SPECIES_PAL(MEDICHAM, gMonPalette_Medicham), - #if P_GEN_4_POKEMON == TRUE - SPECIES_PAL(STARLY, gMonPalette_Starly), - SPECIES_PAL(STARAVIA, gMonPalette_Staravia), - SPECIES_PAL(STARAPTOR, gMonPalette_Staraptor), - SPECIES_PAL(BIDOOF, gMonPalette_Bidoof), - SPECIES_PAL(KRICKETOT, gMonPalette_Kricketot), - SPECIES_PAL(KRICKETUNE, gMonPalette_Kricketune), - SPECIES_PAL(SHINX, gMonPalette_Shinx), SPECIES_PAL(COMBEE, gMonPalette_CombeeF), - SPECIES_PAL(AMBIPOM, gMonPalette_Ambipom), - SPECIES_PAL(GIBLE, gMonPalette_Gible), - SPECIES_PAL(GABITE, gMonPalette_Gabite), - SPECIES_PAL(GARCHOMP, gMonPalette_Garchomp), SPECIES_PAL(HIPPOPOTAS, gMonPalette_HippopotasF), SPECIES_PAL(HIPPOWDON, gMonPalette_HippowdonF), - SPECIES_PAL(WEAVILE, gMonPalette_Weavile), - SPECIES_PAL(RHYPERIOR, gMonPalette_Rhyperior), - SPECIES_PAL(TANGROWTH, gMonPalette_Tangrowth), - SPECIES_PAL(MAMOSWINE, gMonPalette_Mamoswine), #endif #if P_GEN_5_POKEMON == TRUE SPECIES_PAL(UNFEZANT, gMonPalette_UnfezantF), SPECIES_PAL(FRILLISH, gMonPalette_FrillishF), SPECIES_PAL(JELLICENT, gMonPalette_JellicentF), #endif -#if P_GEN_6_POKEMON == TRUE - SPECIES_PAL(PYROAR, gMonPalette_Pyroar), -#endif - - SPECIES_PAL(SNEASEL_HISUIAN, gMonPalette_SneaselHisuian), }; diff --git a/src/data/pokemon_graphics/shiny_palette_table.h b/src/data/pokemon_graphics/shiny_palette_table.h index b890f1fb1..b674617b6 100644 --- a/src/data/pokemon_graphics/shiny_palette_table.h +++ b/src/data/pokemon_graphics/shiny_palette_table.h @@ -1,4 +1,4 @@ -const struct CompressedSpritePalette gMonShinyPaletteTable[] = +const struct CompressedSpritePalette gMonShinyPaletteTable[NUM_SPECIES + 1] = { SPECIES_SHINY_PAL(NONE, gMonShinyPalette_CircledQuestionMark), SPECIES_SHINY_PAL(BULBASAUR, gMonShinyPalette_Bulbasaur), @@ -1335,92 +1335,16 @@ const struct CompressedSpritePalette gMonShinyPaletteTable[] = SPECIES_SHINY_PAL(EGG, gMonPalette_Egg), }; -const struct CompressedSpritePalette gMonShinyPaletteTableFemale[] = +const struct CompressedSpritePalette gMonShinyPaletteTableFemale[NUM_SPECIES + 1] = { - SPECIES_SHINY_PAL(VENUSAUR, gMonShinyPalette_Venusaur), - SPECIES_SHINY_PAL(BUTTERFREE, gMonShinyPalette_Butterfree), - SPECIES_SHINY_PAL(RATTATA, gMonShinyPalette_Rattata), - SPECIES_SHINY_PAL(RATICATE, gMonShinyPalette_Raticate), - SPECIES_SHINY_PAL(PIKACHU, gMonShinyPalette_Pikachu), - SPECIES_SHINY_PAL(RAICHU, gMonShinyPalette_Raichu), - SPECIES_SHINY_PAL(ZUBAT, gMonShinyPalette_Zubat), - SPECIES_SHINY_PAL(GOLBAT, gMonShinyPalette_Golbat), - SPECIES_SHINY_PAL(GLOOM, gMonShinyPalette_Gloom), - SPECIES_SHINY_PAL(VILEPLUME, gMonShinyPalette_Vileplume), - SPECIES_SHINY_PAL(KADABRA, gMonShinyPalette_Kadabra), - SPECIES_SHINY_PAL(ALAKAZAM, gMonShinyPalette_Alakazam), - SPECIES_SHINY_PAL(DODUO, gMonShinyPalette_Doduo), - SPECIES_SHINY_PAL(DODRIO, gMonShinyPalette_Dodrio), - SPECIES_SHINY_PAL(HYPNO, gMonShinyPalette_Hypno), - SPECIES_SHINY_PAL(RHYHORN, gMonShinyPalette_Rhyhorn), - SPECIES_SHINY_PAL(RHYDON, gMonShinyPalette_Rhydon), - SPECIES_SHINY_PAL(GOLDEEN, gMonShinyPalette_Goldeen), - SPECIES_SHINY_PAL(SEAKING, gMonShinyPalette_Seaking), - SPECIES_SHINY_PAL(SCYTHER, gMonShinyPalette_Scyther), - SPECIES_SHINY_PAL(MAGIKARP, gMonShinyPalette_Magikarp), - SPECIES_SHINY_PAL(GYARADOS, gMonShinyPalette_Gyarados), - SPECIES_SHINY_PAL(EEVEE, gMonShinyPalette_Eevee), - SPECIES_SHINY_PAL(MEGANIUM, gMonShinyPalette_Meganium), - SPECIES_SHINY_PAL(LEDYBA, gMonShinyPalette_Ledyba), - SPECIES_SHINY_PAL(LEDIAN, gMonShinyPalette_Ledian), - SPECIES_SHINY_PAL(XATU, gMonShinyPalette_Xatu), - SPECIES_SHINY_PAL(SUDOWOODO, gMonShinyPalette_Sudowoodo), - SPECIES_SHINY_PAL(POLITOED, gMonShinyPalette_Politoed), - SPECIES_SHINY_PAL(AIPOM, gMonShinyPalette_Aipom), - SPECIES_SHINY_PAL(WOOPER, gMonShinyPalette_Wooper), - SPECIES_SHINY_PAL(QUAGSIRE, gMonShinyPalette_Quagsire), - SPECIES_SHINY_PAL(MURKROW, gMonShinyPalette_Murkrow), - SPECIES_SHINY_PAL(WOBBUFFET, gMonShinyPalette_Wobbuffet), - SPECIES_SHINY_PAL(GIRAFARIG, gMonShinyPalette_Girafarig), - SPECIES_SHINY_PAL(GLIGAR, gMonShinyPalette_Gligar), - SPECIES_SHINY_PAL(STEELIX, gMonShinyPalette_Steelix), - SPECIES_SHINY_PAL(SCIZOR, gMonShinyPalette_Scizor), - SPECIES_SHINY_PAL(HERACROSS, gMonShinyPalette_Heracross), - SPECIES_SHINY_PAL(SNEASEL, gMonShinyPalette_Sneasel), - SPECIES_SHINY_PAL(URSARING, gMonShinyPalette_Ursaring), - SPECIES_SHINY_PAL(PILOSWINE, gMonShinyPalette_Piloswine), - SPECIES_SHINY_PAL(OCTILLERY, gMonShinyPalette_Octillery), - SPECIES_SHINY_PAL(HOUNDOOM, gMonShinyPalette_Houndoom), - SPECIES_SHINY_PAL(DONPHAN, gMonShinyPalette_Donphan), - SPECIES_SHINY_PAL(TORCHIC, gMonShinyPalette_Torchic), - SPECIES_SHINY_PAL(COMBUSKEN, gMonShinyPalette_Combusken), - SPECIES_SHINY_PAL(BLAZIKEN, gMonShinyPalette_Blaziken), - SPECIES_SHINY_PAL(BEAUTIFLY, gMonShinyPalette_Beautifly), - SPECIES_SHINY_PAL(DUSTOX, gMonShinyPalette_Dustox), - SPECIES_SHINY_PAL(LUDICOLO, gMonShinyPalette_Ludicolo), - SPECIES_SHINY_PAL(NUZLEAF, gMonShinyPalette_Nuzleaf), - SPECIES_SHINY_PAL(SHIFTRY, gMonShinyPalette_Shiftry), - SPECIES_SHINY_PAL(MEDITITE, gMonShinyPalette_Meditite), - SPECIES_SHINY_PAL(MEDICHAM, gMonShinyPalette_Medicham), - #if P_GEN_4_POKEMON == TRUE - SPECIES_SHINY_PAL(STARLY, gMonShinyPalette_Starly), - SPECIES_SHINY_PAL(STARAVIA, gMonShinyPalette_Staravia), - SPECIES_SHINY_PAL(STARAPTOR, gMonShinyPalette_Staraptor), - SPECIES_SHINY_PAL(BIDOOF, gMonShinyPalette_Bidoof), - SPECIES_SHINY_PAL(KRICKETOT, gMonShinyPalette_Kricketot), - SPECIES_SHINY_PAL(KRICKETUNE, gMonShinyPalette_Kricketune), - SPECIES_SHINY_PAL(SHINX, gMonShinyPalette_Shinx), SPECIES_SHINY_PAL(COMBEE, gMonShinyPalette_CombeeF), - SPECIES_SHINY_PAL(AMBIPOM, gMonShinyPalette_Ambipom), - SPECIES_SHINY_PAL(GIBLE, gMonShinyPalette_Gible), - SPECIES_SHINY_PAL(GABITE, gMonShinyPalette_Gabite), - SPECIES_SHINY_PAL(GARCHOMP, gMonShinyPalette_Garchomp), SPECIES_SHINY_PAL(HIPPOPOTAS, gMonShinyPalette_HippopotasF), SPECIES_SHINY_PAL(HIPPOWDON, gMonShinyPalette_HippowdonF), - SPECIES_SHINY_PAL(WEAVILE, gMonShinyPalette_Weavile), - SPECIES_SHINY_PAL(RHYPERIOR, gMonShinyPalette_Rhyperior), - SPECIES_SHINY_PAL(TANGROWTH, gMonShinyPalette_Tangrowth), - SPECIES_SHINY_PAL(MAMOSWINE, gMonShinyPalette_Mamoswine), #endif #if P_GEN_5_POKEMON == TRUE SPECIES_SHINY_PAL(UNFEZANT, gMonShinyPalette_UnfezantF), SPECIES_SHINY_PAL(FRILLISH, gMonShinyPalette_FrillishF), SPECIES_SHINY_PAL(JELLICENT, gMonShinyPalette_JellicentF), #endif -#if P_GEN_6_POKEMON == TRUE - SPECIES_SHINY_PAL(PYROAR, gMonShinyPalette_Pyroar), -#endif - - SPECIES_SHINY_PAL(SNEASEL_HISUIAN, gMonShinyPalette_SneaselHisuian), }; diff --git a/src/decompress.c b/src/decompress.c index f5d4ff233..54e7200be 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -63,17 +63,19 @@ void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePale void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer, s32 species) { if (species > NUM_SPECIES) - LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); + LZ77UnCompWram(gMonFrontPicTable[SPECIES_NONE].data, buffer); else LZ77UnCompWram(src->data, buffer); } void DecompressPicFromTableGender(void* buffer, s32 species, u32 personality) { - if (ShouldShowFemaleDifferences(species, personality)) - DecompressPicFromTable(&gMonFrontPicTableFemale[species], buffer, species); + if (gMonFrontPicTableFemale[species].data != NULL && IsPersonalityFemale(species, personality)) + LZ77UnCompWram(gMonFrontPicTableFemale[species].data, buffer); + else if (gMonFrontPicTable[species].data != NULL) + LZ77UnCompWram(gMonFrontPicTable[species].data, buffer); else - DecompressPicFromTable(&gMonFrontPicTable[species], buffer, species); + LZ77UnCompWram(gMonFrontPicTable[SPECIES_NONE].data, buffer); } void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 personality) @@ -83,35 +85,28 @@ void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 pe void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontPic) { - if (species == SPECIES_UNOWN) - { - u32 id = GetUnownSpeciesId(personality); + if (species > NUM_SPECIES) + species = SPECIES_NONE; + else if (species == SPECIES_UNOWN) + species = GetUnownSpeciesId(personality); - if (!isFrontPic) - LZ77UnCompWram(gMonBackPicTable[id].data, dest); - else - LZ77UnCompWram(gMonFrontPicTable[id].data, dest); - } - else if (species > NUM_SPECIES) // is species unknown? draw the ? icon + if (isFrontPic) { - if (isFrontPic) - LZ77UnCompWram(gMonFrontPicTable[0].data, dest); - else - LZ77UnCompWram(gMonBackPicTable[0].data, dest); - } - else if (ShouldShowFemaleDifferences(species, personality)) - { - if (isFrontPic) + if (gMonFrontPicTableFemale[species].data != NULL && IsPersonalityFemale(species, personality)) LZ77UnCompWram(gMonFrontPicTableFemale[species].data, dest); + else if (gMonFrontPicTable[species].data != NULL) + LZ77UnCompWram(gMonFrontPicTable[species].data, dest); else - LZ77UnCompWram(gMonBackPicTableFemale[species].data, dest); + LZ77UnCompWram(gMonFrontPicTable[SPECIES_NONE].data, dest); } else { - if (isFrontPic) - LZ77UnCompWram(gMonFrontPicTable[species].data, dest); - else + if (gMonBackPicTableFemale[species].data != NULL && IsPersonalityFemale(species, personality)) + LZ77UnCompWram(gMonBackPicTableFemale[species].data, dest); + else if (gMonBackPicTable[species].data != NULL) LZ77UnCompWram(gMonBackPicTable[species].data, dest); + else + LZ77UnCompWram(gMonBackPicTable[SPECIES_NONE].data, dest); } DrawSpindaSpots(species, personality, dest, isFrontPic); diff --git a/src/field_effect.c b/src/field_effect.c index b8e3cecc6..acd6e9e94 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -236,7 +236,7 @@ static void Task_MoveDeoxysRock(u8 taskId); static u8 sActiveList[32]; // External declarations -extern struct CompressedSpritePalette gMonPaletteTable[]; // GF made a mistake and did not extern it as const. +extern const struct CompressedSpritePalette gMonPaletteTable[]; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; extern u8 *gFieldEffectScriptPointers[]; diff --git a/src/pokemon.c b/src/pokemon.c index fca93e67e..3a431aba2 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4478,6 +4478,11 @@ u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) return MON_MALE; } +bool32 IsPersonalityFemale(u16 species, u32 personality) +{ + return GetGenderFromSpeciesAndPersonality(species, personality) == MON_FEMALE; +} + u32 GetUnownSpeciesId(u32 personality) { u16 unownLetter = GetUnownLetterByPersonality(personality); @@ -4502,9 +4507,19 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition) if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) gMultiuseSpriteTemplate.anims = gAnims_MonPic; else if (speciesTag > SPECIES_SHINY_TAG) + { + if (gMonFrontAnimsPtrTable[speciesTag - SPECIES_SHINY_TAG] != NULL) gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag - SPECIES_SHINY_TAG]; else + gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[SPECIES_NONE]; + } + else + { + if (gMonFrontAnimsPtrTable[speciesTag] != NULL) gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag]; + else + gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[SPECIES_NONE]; + } } void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition) @@ -7627,17 +7642,21 @@ const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 p shinyValue = GET_SHINY_VALUE(otId, personality); if (shinyValue < SHINY_ODDS) { - if (ShouldShowFemaleDifferences(species, personality)) + if (gMonShinyPaletteTableFemale[species].data != NULL && IsPersonalityFemale(species, personality)) return gMonShinyPaletteTableFemale[species].data; - else + else if (gMonShinyPaletteTable[species].data != NULL) return gMonShinyPaletteTable[species].data; + else + return gMonShinyPaletteTable[SPECIES_NONE].data; } else { - if (ShouldShowFemaleDifferences(species, personality)) + if (gMonPaletteTableFemale[species].data != NULL && IsPersonalityFemale(species, personality)) return gMonPaletteTableFemale[species].data; - else + else if (gMonPaletteTable[species].data != NULL) return gMonPaletteTable[species].data; + else + return gMonPaletteTable[SPECIES_NONE].data; } } @@ -7656,17 +7675,21 @@ const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u shinyValue = GET_SHINY_VALUE(otId, personality); if (shinyValue < SHINY_ODDS) { - if (ShouldShowFemaleDifferences(species, personality)) + if (gMonShinyPaletteTableFemale[species].data != NULL && IsPersonalityFemale(species, personality)) return &gMonShinyPaletteTableFemale[species]; - else + else if (gMonShinyPaletteTable[species].data != NULL) return &gMonShinyPaletteTable[species]; + else + return &gMonShinyPaletteTable[SPECIES_NONE]; } else { - if (ShouldShowFemaleDifferences(species, personality)) + if (gMonPaletteTableFemale[species].data != NULL && IsPersonalityFemale(species, personality)) return &gMonPaletteTableFemale[species]; - else + else if (gMonPaletteTable[species].data != NULL) return &gMonPaletteTable[species]; + else + return &gMonPaletteTable[SPECIES_NONE]; } } @@ -8491,11 +8514,16 @@ void TrySpecialOverworldEvo(void) SetMainCallback2(CB2_ReturnToField); } -bool32 ShouldShowFemaleDifferences(u16 species, u32 personality) +bool32 SpeciesHasGenderDifferences(u16 species) { - if (species >= NUM_SPECIES) - return FALSE; - return (gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && GetGenderFromSpeciesAndPersonality(species, personality) == MON_FEMALE; + if (gMonFrontPicTableFemale[species].data != NULL + || gMonPaletteTableFemale[species].data != NULL + || gMonBackPicTableFemale[species].data != NULL + || gMonShinyPaletteTableFemale[species].data != NULL + || gMonIconTableFemale[species] != NULL) + return TRUE; + + return FALSE; } bool32 TryFormChange(u32 monId, u32 side, u16 method) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index bed5f221f..2bfcbfac1 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -415,21 +415,21 @@ static void PrintInstructionsOnWindow(struct PokemonDebugMenu *data) FillWindowPixelBuffer(WIN_INSTRUCTIONS, 0x11); if (data->currentSubmenu == 0) { - if (gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) + if (SpeciesHasGenderDifferences(species)) AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsGender, x, 0, 0, NULL); else AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructions, x, 0, 0, NULL); } else if (data->currentSubmenu == 1) { - if (gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) + if (SpeciesHasGenderDifferences(species)) AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuOneGender, x, 0, 0, NULL); else AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuOne, x, 0, 0, NULL); } else if (data->currentSubmenu == 2) { - if (gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) + if (SpeciesHasGenderDifferences(species)) AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuTwoGender, x, 0, 0, NULL); else AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuTwo, x, 0, 0, NULL); @@ -483,7 +483,7 @@ static void PrintDigitChars(struct PokemonDebugMenu *data) text[i++] = CHAR_SPACE; text[i++] = CHAR_HYPHEN; - if (gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) + if (SpeciesHasGenderDifferences(species)) { if (data->isFemale) text[i++] = CHAR_FEMALE; @@ -686,17 +686,21 @@ static const struct CompressedSpritePalette *GetMonSpritePalStructCustom(u16 spe { if (isShiny) { - if ((gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && isFemale) + if (gMonShinyPaletteTableFemale[species].data != NULL && isFemale) return &gMonShinyPaletteTableFemale[species]; - else + else if (gMonShinyPaletteTable[species].data != NULL) return &gMonShinyPaletteTable[species]; + else + return &gMonShinyPaletteTable[SPECIES_NONE]; } else { - if ((gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && isFemale) + if (gMonPaletteTableFemale[species].data != NULL && isFemale) return &gMonPaletteTableFemale[species]; - else + else if (gMonPaletteTable[species].data != NULL) return &gMonPaletteTable[species]; + else + return &gMonPaletteTable[SPECIES_NONE]; } } @@ -712,17 +716,21 @@ static void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bo if (isShiny) { - if ((gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && isFemale) + if (gMonShinyPaletteTableFemale[species].data != NULL && isFemale) lzPaletteData = gMonShinyPaletteTableFemale[species].data; - else + else if (gMonShinyPaletteTable[species].data != NULL) lzPaletteData = gMonShinyPaletteTable[species].data; + else + lzPaletteData = gMonShinyPaletteTable[SPECIES_NONE].data; } else { - if ((gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && isFemale) + if (gMonPaletteTableFemale[species].data != NULL && isFemale) lzPaletteData = gMonPaletteTableFemale[species].data; - else + else if (gMonPaletteTable[species].data != NULL) lzPaletteData = gMonPaletteTable[species].data; + else + lzPaletteData = gMonPaletteTable[SPECIES_NONE].data; } LZDecompressWram(lzPaletteData, gDecompressionBuffer); @@ -1450,7 +1458,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) ReloadPokemonSprites(data); ApplyOffsetSpriteValues(data); } - if (JOY_NEW(SELECT_BUTTON) && (gSpeciesInfo[data->currentmonId].flags & SPECIES_FLAG_GENDER_DIFFERENCE)) + if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifferences(data->currentmonId)) { data->isFemale = !data->isFemale; PrintDigitChars(data); diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index c1a469485..7c1bf27c8 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -24,9 +24,9 @@ struct MonIconSpriteTemplate static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); static void FreeAndDestroyMonIconSprite_(struct Sprite *sprite); -const u8 *const gMonIconTable[] = +const u8 *const gMonIconTable[NUM_SPECIES + 1] = { - [SPECIES_NONE] = gMonIcon_Bulbasaur, + [SPECIES_NONE] = gMonIcon_QuestionMark, [SPECIES_BULBASAUR] = gMonIcon_Bulbasaur, [SPECIES_IVYSAUR] = gMonIcon_Ivysaur, [SPECIES_VENUSAUR] = gMonIcon_Venusaur, @@ -1298,87 +1298,12 @@ const u8 *const gMonIconTable[] = [SPECIES_EGG] = gMonIcon_Egg, }; -const u8 *const gMonIconTableFemale[] = +// Female icon palette indexes still need to be defined in gMonIconPaletteIndicesFemale, even if they are the same as males. +const u8 *const gMonIconTableFemale[NUM_SPECIES + 1] = { - [SPECIES_VENUSAUR] = gMonIcon_Venusaur, - [SPECIES_BUTTERFREE] = gMonIcon_Butterfree, - [SPECIES_RATTATA] = gMonIcon_Rattata, - [SPECIES_RATICATE] = gMonIcon_Raticate, - [SPECIES_PIKACHU] = gMonIcon_Pikachu, - [SPECIES_RAICHU] = gMonIcon_Raichu, - [SPECIES_ZUBAT] = gMonIcon_Zubat, - [SPECIES_GOLBAT] = gMonIcon_Golbat, - [SPECIES_GLOOM] = gMonIcon_Gloom, - [SPECIES_VILEPLUME] = gMonIcon_Vileplume, - [SPECIES_KADABRA] = gMonIcon_Kadabra, - [SPECIES_ALAKAZAM] = gMonIcon_Alakazam, - [SPECIES_DODUO] = gMonIcon_Doduo, - [SPECIES_DODRIO] = gMonIcon_Dodrio, - [SPECIES_HYPNO] = gMonIcon_Hypno, - [SPECIES_RHYHORN] = gMonIcon_Rhyhorn, - [SPECIES_RHYDON] = gMonIcon_Rhydon, - [SPECIES_GOLDEEN] = gMonIcon_Goldeen, - [SPECIES_SEAKING] = gMonIcon_Seaking, - [SPECIES_SCYTHER] = gMonIcon_Scyther, - [SPECIES_MAGIKARP] = gMonIcon_Magikarp, - [SPECIES_GYARADOS] = gMonIcon_Gyarados, - [SPECIES_EEVEE] = gMonIcon_Eevee, - [SPECIES_MEGANIUM] = gMonIcon_Meganium, - [SPECIES_LEDYBA] = gMonIcon_Ledyba, - [SPECIES_LEDIAN] = gMonIcon_Ledian, - [SPECIES_XATU] = gMonIcon_Xatu, - [SPECIES_SUDOWOODO] = gMonIcon_Sudowoodo, - [SPECIES_POLITOED] = gMonIcon_Politoed, - [SPECIES_AIPOM] = gMonIcon_Aipom, - [SPECIES_WOOPER] = gMonIcon_Wooper, - [SPECIES_QUAGSIRE] = gMonIcon_Quagsire, - [SPECIES_MURKROW] = gMonIcon_Murkrow, - [SPECIES_WOBBUFFET] = gMonIcon_Wobbuffet, - [SPECIES_GIRAFARIG] = gMonIcon_Girafarig, - [SPECIES_GLIGAR] = gMonIcon_Gligar, - [SPECIES_STEELIX] = gMonIcon_Steelix, - [SPECIES_SCIZOR] = gMonIcon_Scizor, - [SPECIES_HERACROSS] = gMonIcon_Heracross, - [SPECIES_SNEASEL] = gMonIcon_Sneasel, - [SPECIES_URSARING] = gMonIcon_Ursaring, - [SPECIES_PILOSWINE] = gMonIcon_Piloswine, - [SPECIES_OCTILLERY] = gMonIcon_Octillery, - [SPECIES_HOUNDOOM] = gMonIcon_Houndoom, - [SPECIES_DONPHAN] = gMonIcon_Donphan, - [SPECIES_TORCHIC] = gMonIcon_Torchic, - [SPECIES_COMBUSKEN] = gMonIcon_Combusken, - [SPECIES_BLAZIKEN] = gMonIcon_Blaziken, - [SPECIES_BEAUTIFLY] = gMonIcon_Beautifly, - [SPECIES_DUSTOX] = gMonIcon_Dustox, - [SPECIES_LUDICOLO] = gMonIcon_Ludicolo, - [SPECIES_NUZLEAF] = gMonIcon_Nuzleaf, - [SPECIES_SHIFTRY] = gMonIcon_Shiftry, - [SPECIES_MEDITITE] = gMonIcon_Meditite, - [SPECIES_MEDICHAM] = gMonIcon_Medicham, -#if P_GEN_4_POKEMON == TRUE - [SPECIES_STARLY] = gMonIcon_Starly, - [SPECIES_STARAVIA] = gMonIcon_Staravia, - [SPECIES_STARAPTOR] = gMonIcon_Staraptor, - [SPECIES_BIDOOF] = gMonIcon_Bidoof, - [SPECIES_KRICKETOT] = gMonIcon_Kricketot, - [SPECIES_KRICKETUNE] = gMonIcon_Kricketune, - [SPECIES_SHINX] = gMonIcon_Shinx, - [SPECIES_COMBEE] = gMonIcon_Combee, - [SPECIES_AMBIPOM] = gMonIcon_Ambipom, - [SPECIES_GIBLE] = gMonIcon_Gible, - [SPECIES_GABITE] = gMonIcon_Gabite, - [SPECIES_GARCHOMP] = gMonIcon_Garchomp, -#if P_HIPPO_GENDER_DIFF_ICONS == TRUE +#if P_GEN_4_POKEMON == TRUE && P_HIPPO_GENDER_DIFF_ICONS == TRUE [SPECIES_HIPPOPOTAS] = gMonIcon_HippopotasF, [SPECIES_HIPPOWDON] = gMonIcon_HippowdonF, -#else - [SPECIES_HIPPOPOTAS] = gMonIcon_Hippopotas, - [SPECIES_HIPPOWDON] = gMonIcon_Hippowdon, -#endif - [SPECIES_WEAVILE] = gMonIcon_Weavile, - [SPECIES_RHYPERIOR] = gMonIcon_Rhyperior, - [SPECIES_TANGROWTH] = gMonIcon_Tangrowth, - [SPECIES_MAMOSWINE] = gMonIcon_Mamoswine, #endif #if P_GEN_5_POKEMON == TRUE [SPECIES_UNFEZANT] = gMonIcon_UnfezantF, @@ -1388,7 +1313,6 @@ const u8 *const gMonIconTableFemale[] = #if P_GEN_6_POKEMON == TRUE [SPECIES_PYROAR] = gMonIcon_PyroarF, #endif - [SPECIES_SNEASEL_HISUIAN] = gMonIcon_SneaselHisuian, }; const u8 gMonIconPaletteIndices[] = @@ -2610,79 +2534,9 @@ const u8 gMonIconPaletteIndices[] = const u8 gMonIconPaletteIndicesFemale[] = { - [SPECIES_VENUSAUR] = 4, - [SPECIES_BUTTERFREE] = 0, - [SPECIES_RATTATA] = 2, - [SPECIES_RATICATE] = 2, - [SPECIES_PIKACHU] = 2, - [SPECIES_RAICHU] = 0, - [SPECIES_ZUBAT] = 2, - [SPECIES_GOLBAT] = 2, - [SPECIES_GLOOM] = 0, - [SPECIES_VILEPLUME] = 0, - [SPECIES_KADABRA] = 2, - [SPECIES_ALAKAZAM] = 2, - [SPECIES_DODUO] = 2, - [SPECIES_DODRIO] = 2, - [SPECIES_HYPNO] = 2, - [SPECIES_RHYHORN] = 1, - [SPECIES_RHYDON] = 1, - [SPECIES_GOLDEEN] = 0, - [SPECIES_SEAKING] = 0, - [SPECIES_SCYTHER] = 1, - [SPECIES_MAGIKARP] = 0, - [SPECIES_GYARADOS] = 0, - [SPECIES_EEVEE] = 2, - [SPECIES_MEGANIUM] = 1, - [SPECIES_LEDYBA] = 0, - [SPECIES_LEDIAN] = 0, - [SPECIES_XATU] = 1, - [SPECIES_SUDOWOODO] = 1, - [SPECIES_POLITOED] = 1, - [SPECIES_AIPOM] = 2, - [SPECIES_WOOPER] = 0, - [SPECIES_QUAGSIRE] = 0, - [SPECIES_MURKROW] = 2, - [SPECIES_WOBBUFFET] = 0, - [SPECIES_GIRAFARIG] = 1, - [SPECIES_GLIGAR] = 0, - [SPECIES_STEELIX] = 0, - [SPECIES_SCIZOR] = 0, - [SPECIES_HERACROSS] = 0, - [SPECIES_SNEASEL] = 0, - [SPECIES_URSARING] = 2, - [SPECIES_PILOSWINE] = 2, - [SPECIES_OCTILLERY] = 0, - [SPECIES_HOUNDOOM] = 0, - [SPECIES_DONPHAN] = 0, - [SPECIES_TORCHIC] = 0, - [SPECIES_COMBUSKEN] = 0, - [SPECIES_BLAZIKEN] = 0, - [SPECIES_BEAUTIFLY] = 0, - [SPECIES_DUSTOX] = 5, - [SPECIES_LUDICOLO] = 1, - [SPECIES_NUZLEAF] = 1, - [SPECIES_SHIFTRY] = 5, - [SPECIES_MEDITITE] = 0, - [SPECIES_MEDICHAM] = 0, #if P_GEN_4_POKEMON == TRUE - [SPECIES_STARLY] = 0, - [SPECIES_STARAVIA] = 0, - [SPECIES_BIDOOF] = 2, - [SPECIES_KRICKETOT] = 2, - [SPECIES_KRICKETUNE] = 2, - [SPECIES_SHINX] = 0, - [SPECIES_COMBEE] = 0, - [SPECIES_AMBIPOM] = 2, - [SPECIES_GIBLE] = 0, - [SPECIES_GABITE] = 0, - [SPECIES_GARCHOMP] = 0, [SPECIES_HIPPOPOTAS] = 1, [SPECIES_HIPPOWDON] = 1, - [SPECIES_WEAVILE] = 0, - [SPECIES_RHYPERIOR] = 0, - [SPECIES_TANGROWTH] = 0, - [SPECIES_MAMOSWINE] = 2, #endif #if P_GEN_5_POKEMON == TRUE [SPECIES_UNFEZANT] = 1, @@ -2692,10 +2546,6 @@ const u8 gMonIconPaletteIndicesFemale[] = #if P_GEN_6_POKEMON == TRUE [SPECIES_PYROAR] = 2, #endif -#if P_GEN_8_POKEMON == TRUE - [SPECIES_BASCULEGION] = 0, -#endif - [SPECIES_SNEASEL_HISUIAN] = 2, }; const struct SpritePalette gMonIconPaletteTable[] = @@ -2826,7 +2676,7 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u if (species > NUM_SPECIES) iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; - else if (ShouldShowFemaleDifferences(species, personality)) + else if (gMonIconTableFemale[species] && IsPersonalityFemale(species, personality)) iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndicesFemale[species]; spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); @@ -2941,7 +2791,7 @@ void LoadMonIconPalette(u16 species) void LoadMonIconPalettePersonality(u16 species, u32 personality) { u8 palIndex; - if (ShouldShowFemaleDifferences(species, personality)) + if (gMonIconTableFemale[species] != NULL && IsPersonalityFemale(species, personality)) palIndex = gMonIconPaletteIndicesFemale[species]; else palIndex = gMonIconPaletteIndices[species]; @@ -2982,10 +2832,15 @@ const u8 *GetMonIconTiles(u16 species, u32 personality) { const u8 *iconSprite; - if (ShouldShowFemaleDifferences(species, personality)) + if (species > NUM_SPECIES) + species = SPECIES_NONE; + + if (gMonIconTableFemale[species] != NULL && IsPersonalityFemale(species, personality)) iconSprite = gMonIconTableFemale[species]; - else + else if (gMonIconTable[species] != NULL) iconSprite = gMonIconTable[species]; + else + iconSprite = gMonIconTable[SPECIES_NONE]; return iconSprite; } diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 50f315abd..0d621d205 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -5110,7 +5110,7 @@ static u16 TryLoadMonIconTiles(u16 species, u32 personality) u16 i, offset; // Treat female mons as a seperate species as they may have a different icon than males - if (ShouldShowFemaleDifferences(species, personality)) + if (gMonIconTableFemale[species] != NULL && IsPersonalityFemale(species, personality)) species |= 0x8000; // 1 << 15 // Search icon list for this species @@ -5177,7 +5177,7 @@ static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s struct SpriteTemplate template = sSpriteTemplate_MonIcon; species = GetIconSpecies(species, personality); - if (ShouldShowFemaleDifferences(species, personality)) + if (gMonIconTableFemale[species] != NULL && IsPersonalityFemale(species, personality)) { template.paletteTag = PALTAG_MON_ICON_0 + gMonIconPaletteIndicesFemale[species]; } From 3aaa89ce7192c13c9abfbe36a299e7d3d8cfefe7 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 7 Jul 2023 14:37:51 -0400 Subject: [PATCH 025/111] Changed all instances of gSpeciesNames so that it uses GetSpeciesName --- include/data.h | 2 +- include/pokemon.h | 4 +- src/apprentice.c | 14 +-- src/battle_dome.c | 6 +- src/battle_factory_screen.c | 8 +- src/battle_interface.c | 2 +- src/battle_message.c | 2 +- src/battle_pyramid.c | 2 +- src/battle_tower.c | 2 +- src/cable_club.c | 4 +- src/data/text/species_names.h | 2 +- src/debug.c | 6 +- src/easy_chat.c | 2 +- src/egg_hatch.c | 2 +- src/evolution_scene.c | 6 +- src/frontier_util.c | 2 +- src/hall_of_fame.c | 2 +- src/match_call.c | 12 +- src/menu_specialized.c | 2 +- src/naming_screen.c | 2 +- src/party_menu.c | 2 +- src/pokedex.c | 10 +- src/pokemon.c | 42 +++---- src/pokemon_debug.c | 2 +- src/pokemon_size_record.c | 2 +- src/pokemon_storage_system.c | 2 +- src/pokemon_summary_screen.c | 2 +- src/pokenav_conditions.c | 2 +- src/scrcmd.c | 4 +- src/starter_choose.c | 2 +- src/trade.c | 8 +- src/tv.c | 202 +++++++++++++++++----------------- src/union_room.c | 8 +- 33 files changed, 187 insertions(+), 185 deletions(-) diff --git a/include/data.h b/include/data.h index 5bf555e28..d8e25df82 100644 --- a/include/data.h +++ b/include/data.h @@ -161,7 +161,7 @@ extern const struct CompressedSpriteSheet gMonFrontPicTableFemale[]; extern const struct Trainer gTrainers[]; extern const u8 gTrainerClassNames[][13]; -extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; +extern const u8 gSpeciesNames[NUM_SPECIES][POKEMON_NAME_LENGTH + 1]; extern const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1]; extern const u8 *const gZMoveNames[]; diff --git a/include/pokemon.h b/include/pokemon.h index 6ca07fbcf..0a4e160e2 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -523,7 +523,7 @@ u8 GetSecretBaseTrainerPicIndex(void); u8 GetSecretBaseTrainerClass(void); bool8 IsPlayerPartyAndPokemonStorageFull(void); bool8 IsPokemonStorageFull(void); -void GetSpeciesName(u8 *name, u16 species); +const u8 *GetSpeciesName(u16 species); u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex); void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex); void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex); @@ -613,5 +613,7 @@ void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method); u32 GetMonFriendshipScore(struct Pokemon *pokemon); void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality); u8 CalculatePartyCount(struct Pokemon *party); +u16 SanitizeSpeciesId(u16 species); +bool32 IsSpeciesEnabled(u16 species); #endif // GUARD_POKEMON_H diff --git a/src/apprentice.c b/src/apprentice.c index ad7568a76..e021f24ca 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -592,7 +592,7 @@ static void CreateApprenticeMenu(u8 menu) speciesTableId = APPRENTICE_SPECIES_ID(i); species = gApprentices[PLAYER_APPRENTICE.id].species[speciesTableId]; - strings[i] = gSpeciesNames[species]; + strings[i] = GetSpeciesName(species); } break; case APPRENTICE_ASK_2SPECIES: @@ -600,8 +600,8 @@ static void CreateApprenticeMenu(u8 menu) top = 8; if (PLAYER_APPRENTICE.questionsAnswered >= NUM_WHICH_MON_QUESTIONS) return; - strings[1] = gSpeciesNames[gApprenticeQuestionData->altSpeciesId]; - strings[0] = gSpeciesNames[gApprenticeQuestionData->speciesId]; + strings[1] = GetSpeciesName(gApprenticeQuestionData->altSpeciesId); + strings[0] = GetSpeciesName(gApprenticeQuestionData->speciesId); break; case APPRENTICE_ASK_MOVES: left = 17; @@ -1050,13 +1050,13 @@ static void ApprenticeBufferString(void) switch (gSpecialVar_0x8006) { case APPRENTICE_BUFF_SPECIES1: - StringCopy(stringDst, gSpeciesNames[gApprenticeQuestionData->speciesId]); + StringCopy(stringDst, GetSpeciesName(gApprenticeQuestionData->speciesId)); break; case APPRENTICE_BUFF_SPECIES2: - StringCopy(stringDst, gSpeciesNames[gApprenticeQuestionData->altSpeciesId]); + StringCopy(stringDst, GetSpeciesName(gApprenticeQuestionData->altSpeciesId)); break; case APPRENTICE_BUFF_SPECIES3: - StringCopy(stringDst, gSpeciesNames[gApprenticeQuestionData->speciesId]); + StringCopy(stringDst, GetSpeciesName(gApprenticeQuestionData->speciesId)); break; case APPRENTICE_BUFF_MOVE1: StringCopy(stringDst, gMoveNames[gApprenticeQuestionData->moveId1]); @@ -1083,7 +1083,7 @@ static void ApprenticeBufferString(void) break; case APPRENTICE_BUFF_LEAD_MON_SPECIES: speciesArrayId = APPRENTICE_SPECIES_ID(PLAYER_APPRENTICE.leadMonId); - StringCopy(stringDst, gSpeciesNames[gApprentices[PLAYER_APPRENTICE.id].species[speciesArrayId]]); + StringCopy(stringDst, GetSpeciesName(gApprentices[PLAYER_APPRENTICE.id].species[speciesArrayId])); break; } } diff --git a/src/battle_dome.c b/src/battle_dome.c index deae7e64f..c63f77c63 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -4392,11 +4392,11 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) { textPrinter.currentY = sSpeciesNameTextYCoords[i]; if (trainerId == TRAINER_PLAYER) - textPrinter.currentChar = gSpeciesNames[DOME_MONS[trainerTourneyId][i]]; + textPrinter.currentChar = GetSpeciesName(DOME_MONS[trainerTourneyId][i]); else if (trainerId == TRAINER_FRONTIER_BRAIN) - textPrinter.currentChar = gSpeciesNames[DOME_MONS[trainerTourneyId][i]]; + textPrinter.currentChar = GetSpeciesName(DOME_MONS[trainerTourneyId][i]); else - textPrinter.currentChar = gSpeciesNames[gFacilityTrainerMons[DOME_MONS[trainerTourneyId][i]].species]; + textPrinter.currentChar = GetSpeciesName(gFacilityTrainerMons[DOME_MONS[trainerTourneyId][i]].species); textPrinter.windowId = WIN_TRAINER_MON1_NAME + i + windowId; if (i == 1) diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index 6366404ce..88c655b8d 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -1872,7 +1872,7 @@ static void Select_PrintMonSpecies(void) FillWindowPixelBuffer(SELECT_WIN_SPECIES, PIXEL_FILL(0)); species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); + StringCopy(gStringVar4, GetSpeciesName(species)); x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 86); AddTextPrinterParameterized3(SELECT_WIN_SPECIES, FONT_NORMAL, x, 1, sSpeciesNameTextColors, 0, gStringVar4); CopyWindowToVram(SELECT_WIN_SPECIES, COPYWIN_GFX); @@ -3773,7 +3773,7 @@ static void Swap_PrintMonSpecies(void) species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); else species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); + StringCopy(gStringVar4, GetSpeciesName(species)); x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 86); AddTextPrinterParameterized3(SWAP_WIN_SPECIES, FONT_NORMAL, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); CopyWindowToVram(SWAP_WIN_SPECIES, COPYWIN_FULL); @@ -3882,7 +3882,7 @@ static void Swap_PrintMonSpeciesAtFade(void) species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); else species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); + StringCopy(gStringVar4, GetSpeciesName(species)); x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 86); AddTextPrinterParameterized3(SWAP_WIN_SPECIES_AT_FADE, FONT_NORMAL, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); CopyWindowToVram(SWAP_WIN_SPECIES_AT_FADE, COPYWIN_FULL); @@ -3909,7 +3909,7 @@ static void Swap_PrintMonSpeciesForTransition(void) species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); else species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); + StringCopy(gStringVar4, GetSpeciesName(species)); x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 86); AddTextPrinterParameterized3(SWAP_WIN_SPECIES, FONT_NORMAL, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); CopyWindowToVram(SWAP_WIN_SPECIES, COPYWIN_FULL); diff --git a/src/battle_interface.c b/src/battle_interface.c index 1a4909818..fe2540be2 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2096,7 +2096,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) gender = GetMonGender(mon); species = GetMonData(mon, MON_DATA_SPECIES); - if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && StringCompare(nickname, gSpeciesNames[species]) == 0) + if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && StringCompare(nickname, GetSpeciesName(species)) == 0) gender = 100; // AddTextPrinterAndCreateWindowOnHealthbox's arguments are the same in all 3 cases. diff --git a/src/battle_message.c b/src/battle_message.c index 3edb02f60..ed5e1695a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -3662,7 +3662,7 @@ void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) srcID += 2; break; case B_BUFF_SPECIES: // species name - GetSpeciesName(dst, T1_READ_16(&src[srcID + 1])); + StringCopy(dst, GetSpeciesName(T1_READ_16(&src[srcID + 1]))); srcID += 3; break; case B_BUFF_MON_NICK: // poke nick without prefix diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 211488ee5..c390d808f 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1357,7 +1357,7 @@ void GenerateBattlePyramidWildMon(void) id = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) - 1; SetMonData(&gEnemyParty[0], MON_DATA_SPECIES, &wildMons[id].species); - GetSpeciesName(name, wildMons[id].species); + StringCopy(name, GetSpeciesName(wildMons[id].species)); SetMonData(&gEnemyParty[0], MON_DATA_NICKNAME, &name); if (lvl != FRONTIER_LVL_50) { diff --git a/src/battle_tower.c b/src/battle_tower.c index 4e16467f0..4923080fe 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2491,7 +2491,7 @@ static void GetPotentialPartnerMoveAndSpecies(u16 trainerId, u16 monId) } StringCopy(gStringVar1, gMoveNames[move]); - StringCopy(gStringVar2, gSpeciesNames[species]); + StringCopy(gStringVar2, GetSpeciesName(species)); } // For multi battles in the Battle Tower, the player may choose a partner by talking to them diff --git a/src/cable_club.c b/src/cable_club.c index 913a1b728..f5c6135c4 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -446,13 +446,13 @@ bool32 AreBattleTowerLinkSpeciesSame(u16 *speciesList1, u16 *speciesList2) { if (numSameSpecies == 0) { - StringCopy(gStringVar1, gSpeciesNames[speciesList1[i]]); + StringCopy(gStringVar1, GetSpeciesName(speciesList1[i])); haveSameSpecies = TRUE; } if (numSameSpecies == 1) { - StringCopy(gStringVar2, gSpeciesNames[speciesList1[i]]); + StringCopy(gStringVar2, GetSpeciesName(speciesList1[i])); haveSameSpecies = TRUE; } diff --git a/src/data/text/species_names.h b/src/data/text/species_names.h index 9e60b94cf..e9aee3a06 100644 --- a/src/data/text/species_names.h +++ b/src/data/text/species_names.h @@ -1,4 +1,4 @@ -const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = { +const u8 gSpeciesNames[NUM_SPECIES][POKEMON_NAME_LENGTH + 1] = { [SPECIES_NONE] = _("??????????"), [SPECIES_BULBASAUR] = _("Bulbasaur"), [SPECIES_IVYSAUR] = _("Ivysaur"), diff --git a/src/debug.c b/src/debug.c index 43ebb01a8..d98699b6e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2048,7 +2048,7 @@ static void DebugAction_Give_PokemonSimple(u8 taskId) //Display initial ID StringCopy(gStringVar2, gText_DigitIndicator[0]); ConvertIntToDecimalStringN(gStringVar3, 1, STR_CONV_MODE_LEADING_ZEROS, 3); - StringCopy(gStringVar1, gSpeciesNames[1]); + StringCopy(gStringVar1, GetSpeciesName(1)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); AddTextPrinterParameterized(windowId, 1, gStringVar4, 1, 1, 0, NULL); @@ -2086,7 +2086,7 @@ static void DebugAction_Give_PokemonComplex(u8 taskId) //Display initial ID StringCopy(gStringVar2, gText_DigitIndicator[0]); ConvertIntToDecimalStringN(gStringVar3, 1, STR_CONV_MODE_LEADING_ZEROS, 4); - StringCopy(gStringVar1, gSpeciesNames[1]); + StringCopy(gStringVar1, GetSpeciesName(1)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); AddTextPrinterParameterized(windowId, 1, gStringVar4, 1, 1, 0, NULL); @@ -2133,7 +2133,7 @@ static void DebugAction_Give_Pokemon_SelectId(u8 taskId) } StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].data[4]]); - StringCopy(gStringVar1, gSpeciesNames[gTasks[taskId].data[3]]); //CopyItemName(gTasks[taskId].data[3], gStringVar1); + StringCopy(gStringVar1, GetSpeciesName(gTasks[taskId].data[3])); //CopyItemName(gTasks[taskId].data[3], gStringVar1); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].data[3], STR_CONV_MODE_LEADING_ZEROS, 4); StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); diff --git a/src/easy_chat.c b/src/easy_chat.c index 476702c20..5ba83f725 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -5204,7 +5204,7 @@ static const u8 *GetEasyChatWord(u8 groupId, u16 index) { case EC_GROUP_POKEMON: case EC_GROUP_POKEMON_NATIONAL: - return gSpeciesNames[index]; + return GetSpeciesName(index); case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: return gMoveNames[index]; diff --git a/src/egg_hatch.c b/src/egg_hatch.c index fe50c80f4..2610cc79f 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -369,7 +369,7 @@ static void AddHatchedMonToParty(u8 id) SetMonData(mon, MON_DATA_IS_EGG, &isEgg); species = GetMonData(mon, MON_DATA_SPECIES); - GetSpeciesName(name, species); + StringCopy(name, GetSpeciesName(species)); SetMonData(mon, MON_DATA_NICKNAME, name); species = SpeciesToNationalPokedexNum(species); diff --git a/src/evolution_scene.c b/src/evolution_scene.c index ec331bf01..fb8353c1e 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -254,7 +254,7 @@ void EvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopEvo, u GetMonData(mon, MON_DATA_NICKNAME, name); StringCopy_Nickname(gStringVar1, name); - StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]); + StringCopy(gStringVar2, GetSpeciesName(postEvoSpecies)); // preEvo sprite currSpecies = GetMonData(mon, MON_DATA_SPECIES); @@ -476,7 +476,7 @@ void TradeEvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, u8 preEvoSprit GetMonData(mon, MON_DATA_NICKNAME, name); StringCopy_Nickname(gStringVar1, name); - StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]); + StringCopy(gStringVar2, GetSpeciesName(postEvoSpecies)); gAffineAnimsDisabled = TRUE; @@ -561,7 +561,7 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(gEvolutionTable[preEvoSpecies][1].targetSpecies)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_ENCRYPT_SEPARATOR, &data); diff --git a/src/frontier_util.c b/src/frontier_util.c index 85e016a26..f8a0fef81 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -1911,7 +1911,7 @@ static u8 AppendCaughtBannedMonSpeciesName(u16 species, u8 count, s32 numBannedM StringAppend(gStringVar1, gText_LineBreak); break; } - StringAppend(gStringVar1, gSpeciesNames[species]); + StringAppend(gStringVar1, GetSpeciesName(species)); } return count; diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 18b4c3e4b..d0584b228 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -1163,7 +1163,7 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u AddTextPrinterParameterized3(0, FONT_NORMAL, width, 1, sMonInfoTextColors, TEXT_SKIP_DRAW, text); text[0] = CHAR_SLASH; - stringPtr = StringCopy(text + 1, gSpeciesNames[currMon->species]); + stringPtr = StringCopy(text + 1, GetSpeciesName(currMon->species)); if (currMon->species != SPECIES_NIDORAN_M && currMon->species != SPECIES_NIDORAN_F) { diff --git a/src/match_call.c b/src/match_call.c index c3378040e..d5ad38000 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1777,7 +1777,7 @@ static void PopulateSpeciesFromTrainerLocation(int matchCallId, u8 *destStr) if (numSpecies) { - StringCopy(destStr, gSpeciesNames[species[Random() % numSpecies]]); + StringCopy(destStr, GetSpeciesName(species[Random() % numSpecies])); return; } } @@ -1801,19 +1801,19 @@ static void PopulateSpeciesFromTrainerParty(int matchCallId, u8 *destStr) { case 0: default: - speciesName = gSpeciesNames[party.NoItemDefaultMoves[monId].species]; + speciesName = GetSpeciesName(party.NoItemDefaultMoves[monId].species); break; case F_TRAINER_PARTY_CUSTOM_MOVESET: - speciesName = gSpeciesNames[party.NoItemCustomMoves[monId].species]; + speciesName = GetSpeciesName(party.NoItemCustomMoves[monId].species); break; case F_TRAINER_PARTY_HELD_ITEM: - speciesName = gSpeciesNames[party.ItemDefaultMoves[monId].species]; + speciesName = GetSpeciesName(party.ItemDefaultMoves[monId].species); break; case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: - speciesName = gSpeciesNames[party.ItemCustomMoves[monId].species]; + speciesName = GetSpeciesName(party.ItemCustomMoves[monId].species); break; case F_TRAINER_PARTY_EVERYTHING_CUSTOMIZED: - speciesName = gSpeciesNames[party.EverythingCustomized[monId].species]; + speciesName = GetSpeciesName(party.EverythingCustomized[monId].species); break; } diff --git a/src/menu_specialized.c b/src/menu_specialized.c index 802d1aec3..c2553d0ed 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -939,7 +939,7 @@ static u8 *GetConditionMenuMonString(u8 *dst, u16 boxId, u16 monId) level = GetLevelFromBoxMonExp(boxMon); } - if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(dst, gSpeciesNames[species])) + if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(dst, GetSpeciesName(species))) gender = MON_GENDERLESS; for (str = dst; *str != EOS; str++) diff --git a/src/naming_screen.c b/src/naming_screen.c index 3962f141a..1b556d908 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1712,7 +1712,7 @@ static void DrawMonTextEntryBox(void) { u8 buffer[32]; - StringCopy(buffer, gSpeciesNames[sNamingScreen->monSpecies]); + StringCopy(buffer, GetSpeciesName(sNamingScreen->monSpecies)); StringAppendN(buffer, sNamingScreen->template->title, 15); FillWindowPixelBuffer(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], PIXEL_FILL(1)); AddTextPrinterParameterized(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], FONT_NORMAL, buffer, 8, 1, 0, 0); diff --git a/src/party_menu.c b/src/party_menu.c index 68d7b058e..fff50ab7b 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -2333,7 +2333,7 @@ static void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, stru if (species == SPECIES_NONE) return; - if ((species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) && StringCompare(nickname, gSpeciesNames[species]) == 0) + if ((species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) && StringCompare(nickname, GetSpeciesName(species)) == 0) return; switch (gender) { diff --git a/src/pokedex.c b/src/pokedex.c index c5b8105b2..b9dc894d3 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -2447,7 +2447,7 @@ static u8 CreateMonName(u16 num, u8 left, u8 top) num = NationalPokedexNumToSpecies(num); if (num) - str = gSpeciesNames[num]; + str = GetSpeciesName(num); else str = sText_TenDashes; PrintMonDexNumAndName(0, FONT_NARROW, str, left, top); @@ -4112,7 +4112,7 @@ static void PrintMonInfo(u32 num, u32 value, u32 owned, u32 newEntry) PrintInfoScreenText(str, 0x60, 0x19); natNum = NationalPokedexNumToSpecies(num); if (natNum) - name = gSpeciesNames[natNum]; + name = GetSpeciesName(natNum); else name = sText_TenDashes2; PrintInfoScreenText(name, 0x84, 0x19); @@ -4459,8 +4459,8 @@ static u8 PrintCryScreenSpeciesName(u8 windowId, u16 num, u8 left, u8 top) switch (num) { default: - for (i = 0; gSpeciesNames[num][i] != EOS && i < POKEMON_NAME_LENGTH; i++) - str[i] = gSpeciesNames[num][i]; + for (i = 0; GetSpeciesName(num)[i] != EOS && i < POKEMON_NAME_LENGTH; i++) + str[i] = GetSpeciesName(num)[i]; break; case 0: for (i = 0; i < 5; i++) @@ -4661,7 +4661,7 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t u8 firstLetter; species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - firstLetter = gSpeciesNames[species][0]; + firstLetter = GetSpeciesName(species)[0]; if (LETTER_IN_RANGE_UPPER(firstLetter, abcGroup) || LETTER_IN_RANGE_LOWER(firstLetter, abcGroup)) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; diff --git a/src/pokemon.c b/src/pokemon.c index 3a431aba2..23edee9a7 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3504,7 +3504,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, checksum = CalculateBoxMonChecksum(boxMon); SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum); EncryptBoxMon(boxMon); - GetSpeciesName(speciesName, species); + StringCopy(speciesName, GetSpeciesName(species)); SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName); SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage); SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName); @@ -4509,14 +4509,14 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition) else if (speciesTag > SPECIES_SHINY_TAG) { if (gMonFrontAnimsPtrTable[speciesTag - SPECIES_SHINY_TAG] != NULL) - gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag - SPECIES_SHINY_TAG]; - else + gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag - SPECIES_SHINY_TAG]; + else gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[SPECIES_NONE]; } else { if (gMonFrontAnimsPtrTable[speciesTag] != NULL) - gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag]; + gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag]; else gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[SPECIES_NONE]; } @@ -5612,22 +5612,9 @@ bool8 IsPokemonStorageFull(void) return TRUE; } -void GetSpeciesName(u8 *name, u16 species) +const u8 *GetSpeciesName(u16 species) { - s32 i; - - for (i = 0; i <= POKEMON_NAME_LENGTH; i++) - { - if (species > NUM_SPECIES) - name[i] = gSpeciesNames[SPECIES_NONE][i]; - else - name[i] = gSpeciesNames[species][i]; - - if (name[i] == EOS) - break; - } - - name[i] = EOS; + return gSpeciesNames[SanitizeSpeciesId(species)]; } u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) @@ -6918,8 +6905,8 @@ void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) u8 language; GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); language = GetMonData(mon, MON_DATA_LANGUAGE, &language); - if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[oldSpecies], gStringVar1)) - SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); + if (language == GAME_LANGUAGE && !StringCompare(GetSpeciesName(oldSpecies), gStringVar1)) + SetMonData(mon, MON_DATA_NICKNAME, GetSpeciesName(newSpecies)); } // The below two functions determine which side of a multi battle the trainer battles on @@ -8551,6 +8538,19 @@ bool32 TryFormChange(u32 monId, u32 side, u16 method) return FALSE; } +u16 SanitizeSpeciesId(u16 species) +{ + if (species > NUM_SPECIES || !IsSpeciesEnabled(species)) + return SPECIES_NONE; + else + return species; +} + +bool32 IsSpeciesEnabled(u16 species) +{ + return gSpeciesInfo[species].baseHP > 0; +} + void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method) { int i, j; diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 2bfcbfac1..3c9a56277 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -493,7 +493,7 @@ static void PrintDigitChars(struct PokemonDebugMenu *data) } text[i++] = CHAR_SPACE; - StringCopy(&text[i], gSpeciesNames[species]); + StringCopy(&text[i], GetSpeciesName(species)); FillWindowPixelBuffer(WIN_NAME_NUMBERS, 0x11); AddTextPrinterParameterized(WIN_NAME_NUMBERS, 1, text, 6, 0, 0, NULL); diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c index 7c88e5bf1..bc2ffe1ae 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon_size_record.c @@ -148,7 +148,7 @@ static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord) u32 size = GetMonSize(species, *sizeRecord); FormatMonSizeRecord(gStringVar3, size); - StringCopy(gStringVar1, gSpeciesNames[species]); + StringCopy(gStringVar1, GetSpeciesName(species)); if (*sizeRecord == DEFAULT_MAX_SIZE) StringCopy(gStringVar2, gText_Marco); else diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 0d621d205..82fdca6f9 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -6993,7 +6993,7 @@ static void SetDisplayMonData(void *pokemon, u8 mode) txtPtr = sStorage->displayMonSpeciesName; *(txtPtr)++ = CHAR_SLASH; - StringCopyPadded(txtPtr, gSpeciesNames[sStorage->displayMonSpecies], CHAR_SPACE, 5); + StringCopyPadded(txtPtr, GetSpeciesName(sStorage->displayMonSpecies), CHAR_SPACE, 5); txtPtr = sStorage->displayMonGenderLvlText; *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index f7106b875..14d9e771a 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2863,7 +2863,7 @@ static void PrintNotEggInfo(void) GetMonNickname(mon, gStringVar1); PrintTextOnWindow(PSS_LABEL_WINDOW_PORTRAIT_NICKNAME, gStringVar1, 0, 1, 0, 1); strArray[0] = CHAR_SLASH; - StringCopy(&strArray[1], &gSpeciesNames[summary->species2][0]); + StringCopy(&strArray[1], &GetSpeciesName(summary->species2)[0]); PrintTextOnWindow(PSS_LABEL_WINDOW_PORTRAIT_SPECIES, strArray, 0, 1, 0, 1); PrintGenderSymbol(mon, summary->species2); PutWindowTilemap(PSS_LABEL_WINDOW_PORTRAIT_NICKNAME); diff --git a/src/pokenav_conditions.c b/src/pokenav_conditions.c index 3c06f6c64..d655c83b5 100644 --- a/src/pokenav_conditions.c +++ b/src/pokenav_conditions.c @@ -365,7 +365,7 @@ static u8 *CopyConditionMonNameGender(u8 *str, u16 listId, bool8 skipPadding) level = GetLevelFromBoxMonExp(boxMon); } - if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species])) + if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, GetSpeciesName(species))) gender = MON_GENDERLESS; str_ = str; // For some reason, a variable is needed to match. diff --git a/src/scrcmd.c b/src/scrcmd.c index 98c20ef4e..bbdcf4c7b 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1552,7 +1552,7 @@ bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 species = VarGet(ScriptReadHalfword(ctx)); - StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); + StringCopy(sScriptStringVars[stringVarIndex], GetSpeciesName(species)); return FALSE; } @@ -1563,7 +1563,7 @@ bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext *ctx) u8 *dest = sScriptStringVars[stringVarIndex]; u8 partyIndex = GetLeadMonIndex(); u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); - StringCopy(dest, gSpeciesNames[species]); + StringCopy(dest, GetSpeciesName(species)); return FALSE; } diff --git a/src/starter_choose.c b/src/starter_choose.c index 3d5291e88..39de696e9 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -577,7 +577,7 @@ static void CreateStarterPokemonLabel(u8 selection) u16 species = GetStarterPokemon(selection); CopyMonCategoryText(SpeciesToNationalPokedexNum(species), categoryText); - speciesName = gSpeciesNames[species]; + speciesName = GetSpeciesName(species); winTemplate = sWindowTemplate_StarterLabel; winTemplate.tilemapLeft = sStarterLabelCoords[selection][0]; diff --git a/src/trade.c b/src/trade.c index b09cc5af7..e4ad3f181 100644 --- a/src/trade.c +++ b/src/trade.c @@ -1165,7 +1165,7 @@ static bool8 BufferTradeParties(void) GetMonData(mon, MON_DATA_NICKNAME, name); if (!StringCompareWithoutExtCtrlCodes(name, sText_ShedinjaJP)) - SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]); + SetMonData(mon, MON_DATA_NICKNAME, GetSpeciesName(SPECIES_SHEDINJA)); } } } @@ -4541,8 +4541,8 @@ static void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite) u16 GetInGameTradeSpeciesInfo(void) { const struct InGameTrade *inGameTrade = &sIngameTrades[gSpecialVar_0x8004]; - StringCopy(gStringVar1, gSpeciesNames[inGameTrade->requestedSpecies]); - StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); + StringCopy(gStringVar1, GetSpeciesName(inGameTrade->requestedSpecies)); + StringCopy(gStringVar2, GetSpeciesName(inGameTrade->species)); return inGameTrade->requestedSpecies; } @@ -4552,7 +4552,7 @@ static void BufferInGameTradeMonName(void) const struct InGameTrade *inGameTrade = &sIngameTrades[gSpecialVar_0x8004]; GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar1, nickname); - StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); + StringCopy(gStringVar2, GetSpeciesName(inGameTrade->species)); } static void CreateInGameTradePokemonInternal(u8 whichPlayerMon, u8 whichInGameTrade) diff --git a/src/tv.c b/src/tv.c index 4400a56c2..b16e7bf89 100644 --- a/src/tv.c +++ b/src/tv.c @@ -1116,7 +1116,7 @@ void TryPutPokemonTodayOnAir(void) else { InitWorldOfMastersShowAttempt(); - if (!rbernoulli(1, 1) && StringCompare(gSpeciesNames[gBattleResults.caughtMonSpecies], gBattleResults.caughtMonNick)) + if (!rbernoulli(1, 1) && StringCompare(GetSpeciesName(gBattleResults.caughtMonSpecies), gBattleResults.caughtMonNick)) { sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_POKEMON_TODAY_CAUGHT, FALSE) != TRUE) @@ -2914,7 +2914,7 @@ static void InterviewBefore_FanClubLetter(void) TryReplaceOldTVShowOfKind(TVSHOW_FAN_CLUB_LETTER); if (!gSpecialVar_Result) { - StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]); + StringCopy(gStringVar1, GetSpeciesName(GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL))); InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanclubLetter.words, ARRAY_COUNT(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanclubLetter.words)); } @@ -2935,7 +2935,7 @@ static void InterviewBefore_PkmnFanClubOpinions(void) TryReplaceOldTVShowOfKind(TVSHOW_PKMN_FAN_CLUB_OPINIONS); if (!gSpecialVar_Result) { - StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]); + StringCopy(gStringVar1, GetSpeciesName(GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL))); GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2); StringGet_Nickname(gStringVar2); InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanclubOpinions.words, @@ -2995,7 +2995,7 @@ static bool8 IsPartyMonNicknamedOrNotEnglish(u8 monIdx) pokemon = &gPlayerParty[monIdx]; GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); language = GetMonData(pokemon, MON_DATA_LANGUAGE, &language); - if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[GetMonData(pokemon, MON_DATA_SPECIES, NULL)], gStringVar1)) + if (language == GAME_LANGUAGE && !StringCompare(GetSpeciesName(GetMonData(pokemon, MON_DATA_SPECIES, NULL)), gStringVar1)) return FALSE; return TRUE; @@ -3059,7 +3059,7 @@ static void CompactTVShowArray(TVShow *shows) static u16 GetRandomDifferentSpeciesAndNameSeenByPlayer(u8 varIdx, u16 excludedSpecies) { u16 species = GetRandomDifferentSpeciesSeenByPlayer(excludedSpecies); - StringCopy(gTVStringVarPtrs[varIdx], gSpeciesNames[species]); + StringCopy(gTVStringVarPtrs[varIdx], GetSpeciesName(species)); return species; } @@ -3221,24 +3221,24 @@ static void GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 } else { - strlen = StringLength(gSpeciesNames[species]); + strlen = StringLength(GetSpeciesName(species)); if (charParam == 0) { - buff[0] = gSpeciesNames[species][whichPosition]; + buff[0] = GetSpeciesName(species)[whichPosition]; } else if (charParam == 1) { - buff[0] = gSpeciesNames[species][strlen - whichPosition]; + buff[0] = GetSpeciesName(species)[strlen - whichPosition]; } else if (charParam == 2) { - buff[0] = gSpeciesNames[species][whichPosition]; - buff[1] = gSpeciesNames[species][whichPosition + 1]; + buff[0] = GetSpeciesName(species)[whichPosition]; + buff[1] = GetSpeciesName(species)[whichPosition + 1]; } else { - buff[0] = gSpeciesNames[species][strlen - (whichPosition + 2)]; - buff[1] = gSpeciesNames[species][strlen - (whichPosition + 1)]; + buff[0] = GetSpeciesName(species)[strlen - (whichPosition + 2)]; + buff[1] = GetSpeciesName(species)[strlen - (whichPosition + 1)]; } } StringCopy(gTVStringVarPtrs[varIdx], buff); @@ -4291,13 +4291,13 @@ static void DoTVShowBravoTrainerPokemonProfile(void) TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory); CopyContestRankToStringVar(2, show->bravoTrainer.contestRank); - if (!StringCompare(gSpeciesNames[show->bravoTrainer.species], show->bravoTrainer.pokemonNickname)) + if (!StringCompare(GetSpeciesName(show->bravoTrainer.species), show->bravoTrainer.pokemonNickname)) sTVShowState = 8; else sTVShowState = 1; break; case 1: - StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); + StringCopy(gStringVar1, GetSpeciesName(show->bravoTrainer.species)); TVShowConvertInternationalString(gStringVar2, show->bravoTrainer.pokemonNickname, show->bravoTrainer.pokemonNameLanguage); CopyContestCategoryToStringVar(2, show->bravoTrainer.contestCategory); sTVShowState = 2; @@ -4331,18 +4331,18 @@ static void DoTVShowBravoTrainerPokemonProfile(void) sTVShowState = 7; break; case 6: - StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); + StringCopy(gStringVar1, GetSpeciesName(show->bravoTrainer.species)); StringCopy(gStringVar2, gMoveNames[show->bravoTrainer.move]); CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]); sTVShowState = 7; break; case 7: TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainer.species]); + StringCopy(gStringVar2, GetSpeciesName(show->bravoTrainer.species)); TVShowDone(); break; case 8: - StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); + StringCopy(gStringVar1, GetSpeciesName(show->bravoTrainer.species)); sTVShowState = 2; break; } @@ -4364,7 +4364,7 @@ static void DoTVShowBravoTrainerBattleTower(void) { case BRAVOTOWER_STATE_INTRO: TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); + StringCopy(gStringVar2, GetSpeciesName(show->bravoTrainerTower.species)); if (show->bravoTrainerTower.numFights >= FRONTIER_STAGES_PER_CHALLENGE) sTVShowState = BRAVOTOWER_STATE_NEW_RECORD; else @@ -4393,7 +4393,7 @@ static void DoTVShowBravoTrainerBattleTower(void) break; case BRAVOTOWER_STATE_WON: TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->bravoTrainerTower.defeatedSpecies)); if (show->bravoTrainerTower.interviewResponse == 0) sTVShowState = BRAVOTOWER_STATE_SATISFIED; else @@ -4401,7 +4401,7 @@ static void DoTVShowBravoTrainerBattleTower(void) break; case BRAVOTOWER_STATE_LOST_FINAL: TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->bravoTrainerTower.defeatedSpecies)); if (show->bravoTrainerTower.interviewResponse == 0) sTVShowState = BRAVOTOWER_STATE_SATISFIED; else @@ -4440,7 +4440,7 @@ static void DoTVShowBravoTrainerBattleTower(void) break; case BRAVOTOWER_STATE_OUTRO: TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); + StringCopy(gStringVar2, GetSpeciesName(show->bravoTrainerTower.species)); TVShowDone(); break; } @@ -4555,7 +4555,7 @@ static void DoTVShowTheNameRaterShow(void) { case 0: TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language); - StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]); + StringCopy(gStringVar2, GetSpeciesName(show->nameRaterShow.species)); TVShowConvertInternationalString(gStringVar3, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage); sTVShowState = GetRandomNameRaterStateFromName(show) + 1; break; @@ -4603,7 +4603,7 @@ static void DoTVShowTheNameRaterShow(void) break; case 15: GetNicknameSubstring(0, 0, 2, 1, 0, show); - StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]); + StringCopy(gStringVar2, GetSpeciesName(show->nameRaterShow.species)); GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.species, show); sTVShowState = 16; break; @@ -4614,7 +4614,7 @@ static void DoTVShowTheNameRaterShow(void) break; case 17: GetNicknameSubstring(0, 0, 2, 1, 0, show); - StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.randomSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->nameRaterShow.randomSpecies)); GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.randomSpecies, show); sTVShowState = 18; break; @@ -4641,7 +4641,7 @@ static void DoTVShowPokemonTodaySuccessfulCapture(void) { case 0: TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + StringCopy(gStringVar2, GetSpeciesName(show->pokemonToday.species)); TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); if (show->pokemonToday.ball == ITEM_MASTER_BALL) sTVShowState = 5; @@ -4661,7 +4661,7 @@ static void DoTVShowPokemonTodaySuccessfulCapture(void) break; case 3: TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + StringCopy(gStringVar2, GetSpeciesName(show->pokemonToday.species)); TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); sTVShowState = 6; break; @@ -4670,25 +4670,25 @@ static void DoTVShowPokemonTodaySuccessfulCapture(void) break; case 5: TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + StringCopy(gStringVar2, GetSpeciesName(show->pokemonToday.species)); sTVShowState = 6; break; case 6: TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + StringCopy(gStringVar2, GetSpeciesName(show->pokemonToday.species)); TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); sTVShowState += 1 + (Random() % 4); break; case 7: case 8: - StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]); + StringCopy(gStringVar1, GetSpeciesName(show->pokemonToday.species)); TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2); GetRandomDifferentSpeciesAndNameSeenByPlayer(2, show->pokemonToday.species); sTVShowState = 11; break; case 9: case 10: - StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]); + StringCopy(gStringVar1, GetSpeciesName(show->pokemonToday.species)); TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2); sTVShowState = 11; break; @@ -4711,13 +4711,13 @@ static void DoTVShowPokemonTodayFailedCapture(void) { case 0: TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonTodayFailed.species]); + StringCopy(gStringVar2, GetSpeciesName(show->pokemonTodayFailed.species)); sTVShowState = 1; break; case 1: TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); GetMapName(gStringVar2, show->pokemonTodayFailed.location, 0); - StringCopy(gStringVar3, gSpeciesNames[show->pokemonTodayFailed.species2]); + StringCopy(gStringVar3, GetSpeciesName(show->pokemonTodayFailed.species2)); if (show->pokemonTodayFailed.outcome == 1) sTVShowState = 3; else @@ -4757,7 +4757,7 @@ static void DoTVShowPokemonFanClubLetter(void) { case 0: TVShowConvertInternationalString(gStringVar1, show->fanclubLetter.playerName, show->fanclubLetter.language); - StringCopy(gStringVar2, gSpeciesNames[show->fanclubLetter.species]); + StringCopy(gStringVar2, GetSpeciesName(show->fanclubLetter.species)); sTVShowState = 50; break; case 1: @@ -4845,7 +4845,7 @@ static void DoTVShowPokemonFanClubOpinions(void) { case 0: TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); - StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]); + StringCopy(gStringVar2, GetSpeciesName(show->fanclubOpinions.species)); TVShowConvertInternationalString(gStringVar3, show->fanclubOpinions.nickname, show->fanclubOpinions.pokemonNameLanguage); sTVShowState = show->fanclubOpinions.questionAsked + 1; break; @@ -4853,7 +4853,7 @@ static void DoTVShowPokemonFanClubOpinions(void) case 2: case 3: TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); - StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]); + StringCopy(gStringVar2, GetSpeciesName(show->fanclubOpinions.species)); CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[0]); sTVShowState = 4; break; @@ -4877,7 +4877,7 @@ static void DoTVShowPokemonNewsMassOutbreak(void) show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; GetMapName(gStringVar1, show->massOutbreak.locationMapNum, 0); - StringCopy(gStringVar2, gSpeciesNames[show->massOutbreak.species]); + StringCopy(gStringVar2, GetSpeciesName(show->massOutbreak.species)); TVShowDone(); StartMassOutbreak(); ShowFieldMessage(sTVMassOutbreakTextGroup[sTVShowState]); @@ -4901,7 +4901,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) { case CONTESTLIVE_STATE_INTRO: BufferContestName(gStringVar1, show->contestLiveUpdates.category); - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage); if (show->contestLiveUpdates.round1Placing == show->contestLiveUpdates.round2Placing) { @@ -4920,7 +4920,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) } break; case CONTESTLIVE_STATE_WON_BOTH_ROUNDS: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); switch (show->contestLiveUpdates.winnerAppealFlag) { case CONTESTLIVE_FLAG_EXCITING_APPEAL: @@ -4950,7 +4950,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) } break; case CONTESTLIVE_STATE_BETTER_ROUND2: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); switch (show->contestLiveUpdates.winnerAppealFlag) { case CONTESTLIVE_FLAG_EXCITING_APPEAL: @@ -4980,7 +4980,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) } break; case CONTESTLIVE_STATE_EQUAL_ROUNDS: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage); switch (show->contestLiveUpdates.winnerAppealFlag) { @@ -5029,7 +5029,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) StringCopy(gStringVar1, gText_Tough); break; } - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); switch (show->contestLiveUpdates.winnerAppealFlag) { case CONTESTLIVE_FLAG_EXCITING_APPEAL: @@ -5059,19 +5059,19 @@ static void DoTVShowPokemonContestLiveUpdates(void) } break; case CONTESTLIVE_STATE_GOT_NERVOUS: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_STARTLED_OTHER: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_USED_COMBO: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_EXCITING_APPEAL: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); switch (show->contestLiveUpdates.category) { case CONTEST_CATEGORY_COOL: @@ -5092,27 +5092,27 @@ static void DoTVShowPokemonContestLiveUpdates(void) } break; case CONTESTLIVE_STATE_COOL: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_BEAUTIFUL: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_CUTE: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_SMART: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_TOUGH: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_VERY_EXCITING_APPEAL: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); switch (show->contestLiveUpdates.category) { case CONTEST_CATEGORY_COOL: @@ -5133,42 +5133,42 @@ static void DoTVShowPokemonContestLiveUpdates(void) } break; case CONTESTLIVE_STATE_VERY_COOL: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_VERY_BEAUTIFUL: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_VERY_CUTE: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_VERY_SMART: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_VERY_TOUGH: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_TOOK_BREAK: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_GOT_STARTLED: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_USED_MOVE: - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); StringCopy(gStringVar3, gMoveNames[show->contestLiveUpdates.move]); sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER; break; case CONTESTLIVE_STATE_TALK_ABOUT_LOSER: - StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar1, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); TVShowConvertInternationalString(gStringVar2, show->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerLanguage); - StringCopy(gStringVar3, gSpeciesNames[show->contestLiveUpdates.losingSpecies]); + StringCopy(gStringVar3, GetSpeciesName(show->contestLiveUpdates.losingSpecies)); switch (show->contestLiveUpdates.loserAppealFlag) { case CONTESTLIVE_FLAG_LOST: @@ -5198,12 +5198,12 @@ static void DoTVShowPokemonContestLiveUpdates(void) } break; case CONTESTLIVE_STATE_NO_APPEALS: - StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.losingSpecies]); + StringCopy(gStringVar1, GetSpeciesName(show->contestLiveUpdates.losingSpecies)); sTVShowState = CONTESTLIVE_STATE_OUTRO; break; case CONTESTLIVE_STATE_LAST_BOTH: TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.losingSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.losingSpecies)); sTVShowState = CONTESTLIVE_STATE_OUTRO; break; case CONTESTLIVE_STATE_NO_EXCITING_APPEALS: @@ -5211,7 +5211,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) break; case CONTESTLIVE_STATE_LOST_SMALL_MARGIN: TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerLanguage); sTVShowState = CONTESTLIVE_STATE_OUTRO; break; @@ -5224,7 +5224,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) break; case CONTESTLIVE_STATE_OUTRO: TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->contestLiveUpdates.winningSpecies)); TVShowDone(); break; } @@ -5268,13 +5268,13 @@ static void DoTVShowPokemonBattleUpdate(void) break; case 2: TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]); + StringCopy(gStringVar2, GetSpeciesName(show->battleUpdate.speciesPlayer)); StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]); sTVShowState = 3; break; case 3: TVShowConvertInternationalString(gStringVar1, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesOpponent]); + StringCopy(gStringVar2, GetSpeciesName(show->battleUpdate.speciesOpponent)); sTVShowState = 4; break; case 4: @@ -5289,14 +5289,14 @@ static void DoTVShowPokemonBattleUpdate(void) break; case 6: TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]); + StringCopy(gStringVar2, GetSpeciesName(show->battleUpdate.speciesPlayer)); StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]); sTVShowState = 7; break; case 7: TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); - StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.speciesOpponent]); + StringCopy(gStringVar3, GetSpeciesName(show->battleUpdate.speciesOpponent)); TVShowDone(); break; } @@ -5430,9 +5430,9 @@ void DoTVShowInSearchOfTrainers(void) sTVShowState = 3; break; case 3: - StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]); + StringCopy(gStringVar1, GetSpeciesName(gSaveBlock1Ptr->gabbyAndTyData.mon1)); StringCopy(gStringVar2, gMoveNames[gSaveBlock1Ptr->gabbyAndTyData.lastMove]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]); + StringCopy(gStringVar3, GetSpeciesName(gSaveBlock1Ptr->gabbyAndTyData.mon2)); sTVShowState = 8; break; case 4: @@ -5443,8 +5443,8 @@ void DoTVShowInSearchOfTrainers(void) break; case 8: CopyEasyChatWord(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.quote[0]); - StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]); + StringCopy(gStringVar2, GetSpeciesName(gSaveBlock1Ptr->gabbyAndTyData.mon1)); + StringCopy(gStringVar3, GetSpeciesName(gSaveBlock1Ptr->gabbyAndTyData.mon2)); gSpecialVar_Result = TRUE; sTVShowState = 0; TakeGabbyAndTyOffTheAir(); @@ -5469,13 +5469,13 @@ static void DoTVShowPokemonAngler(void) { case 0: TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]); + StringCopy(gStringVar2, GetSpeciesName(show->pokemonAngler.species)); ConvertIntToDecimalString(2, show->pokemonAngler.nFails); TVShowDone(); break; case 1: TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]); + StringCopy(gStringVar2, GetSpeciesName(show->pokemonAngler.species)); ConvertIntToDecimalString(2, show->pokemonAngler.nBites); TVShowDone(); break; @@ -5500,13 +5500,13 @@ static void DoTVShowTheWorldOfMasters(void) sTVShowState = 1; break; case 1: - StringCopy(gStringVar1, gSpeciesNames[show->worldOfMasters.species]); + StringCopy(gStringVar1, GetSpeciesName(show->worldOfMasters.species)); sTVShowState = 2; break; case 2: TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language); GetMapName(gStringVar2, show->worldOfMasters.location, 0); - StringCopy(gStringVar3, gSpeciesNames[show->worldOfMasters.caughtPoke]); + StringCopy(gStringVar3, GetSpeciesName(show->worldOfMasters.caughtPoke)); TVShowDone(); break; } @@ -5814,14 +5814,14 @@ static void DoTVShowBreakingNewsTV(void) break; case 1: TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->breakingNews.lastOpponentSpecies)); GetMapName(gStringVar3, show->breakingNews.location, 0); sTVShowState = 2; break; case 2: TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); + StringCopy(gStringVar2, GetSpeciesName(show->breakingNews.lastOpponentSpecies)); + StringCopy(gStringVar3, GetSpeciesName(show->breakingNews.poke1Species)); sTVShowState = 3; break; case 3: @@ -5836,14 +5836,14 @@ static void DoTVShowBreakingNewsTV(void) break; case 5: TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->breakingNews.lastOpponentSpecies)); GetMapName(gStringVar3, show->breakingNews.location, 0); sTVShowState = 6; break; case 6: TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); + StringCopy(gStringVar2, GetSpeciesName(show->breakingNews.lastOpponentSpecies)); + StringCopy(gStringVar3, GetSpeciesName(show->breakingNews.poke1Species)); switch (show->breakingNews.outcome) { case 1: @@ -5862,13 +5862,13 @@ static void DoTVShowBreakingNewsTV(void) break; case 7: StringCopy(gStringVar1, gMoveNames[show->breakingNews.lastUsedMove]); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.poke1Species]); + StringCopy(gStringVar2, GetSpeciesName(show->breakingNews.poke1Species)); sTVShowState = 8; break; case 12: TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); + StringCopy(gStringVar2, GetSpeciesName(show->breakingNews.lastOpponentSpecies)); + StringCopy(gStringVar3, GetSpeciesName(show->breakingNews.poke1Species)); sTVShowState = 8; break; case 8: @@ -5879,7 +5879,7 @@ static void DoTVShowBreakingNewsTV(void) case 9: case 10: TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->breakingNews.lastOpponentSpecies)); GetMapName(gStringVar3, show->breakingNews.location, 0); sTVShowState = 11; break; @@ -5960,7 +5960,7 @@ static void DoTVShowSecretBaseVisit(void) case 11: case 12: TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language); - StringCopy(gStringVar2, gSpeciesNames[show->secretBaseVisit.species]); + StringCopy(gStringVar2, GetSpeciesName(show->secretBaseVisit.species)); StringCopy(gStringVar3, gMoveNames[show->secretBaseVisit.move]); sTVShowState = 13; break; @@ -6005,18 +6005,18 @@ static void DoTVShowThePokemonBattleSeminar(void) { case 0: TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.species]); - StringCopy(gStringVar3, gSpeciesNames[show->battleSeminar.foeSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->battleSeminar.species)); + StringCopy(gStringVar3, GetSpeciesName(show->battleSeminar.foeSpecies)); sTVShowState = 1; break; case 1: TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.foeSpecies]); + StringCopy(gStringVar2, GetSpeciesName(show->battleSeminar.foeSpecies)); StringCopy(gStringVar3, gMoveNames[show->battleSeminar.move]); sTVShowState = 2; break; case 2: - StringCopy(gStringVar1, gSpeciesNames[show->battleSeminar.species]); + StringCopy(gStringVar1, GetSpeciesName(show->battleSeminar.species)); switch (show->battleSeminar.nOtherMoves) { case 1: @@ -6428,24 +6428,24 @@ static void DoTVShowPokemonNewsBattleFrontier(void) sTVShowState = 14; break; case 14: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); - StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); - StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]); + StringCopy(gStringVar1, GetSpeciesName(show->frontier.species1)); + StringCopy(gStringVar2, GetSpeciesName(show->frontier.species2)); + StringCopy(gStringVar3, GetSpeciesName(show->frontier.species3)); sTVShowState = 18; break; case 15: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); - StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); + StringCopy(gStringVar1, GetSpeciesName(show->frontier.species1)); + StringCopy(gStringVar2, GetSpeciesName(show->frontier.species2)); sTVShowState = 18; break; case 16: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); - StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); - StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]); + StringCopy(gStringVar1, GetSpeciesName(show->frontier.species1)); + StringCopy(gStringVar2, GetSpeciesName(show->frontier.species2)); + StringCopy(gStringVar3, GetSpeciesName(show->frontier.species3)); sTVShowState = 17; break; case 17: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species4]); + StringCopy(gStringVar1, GetSpeciesName(show->frontier.species4)); sTVShowState = 18; break; case 18: diff --git a/src/union_room.c b/src/union_room.c index 38f2b22fa..0d33a3521 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -3050,7 +3050,7 @@ static void Task_RunUnionRoom(u8 taskId) } else { - StringCopy(gStringVar1, gSpeciesNames[GetHostRfuGameData()->tradeSpecies]); + StringCopy(gStringVar1, GetSpeciesName(GetHostRfuGameData()->tradeSpecies)); ConvertIntToDecimalStringN(gStringVar2, GetHostRfuGameData()->tradeLevel, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, sText_CancelRegistrationOfMon); } @@ -4109,7 +4109,7 @@ static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct RfuGameData * data else { BlitMenuInfoIcon(windowId, type + 1, 68, y); - PrintUnionRoomText(windowId, FONT_NORMAL, gSpeciesNames[species], 118, y, colorIdx); + PrintUnionRoomText(windowId, FONT_NORMAL, GetSpeciesName(species), 118, y, colorIdx); ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_RIGHT_ALIGN, 3); PrintUnionRoomText(windowId, FONT_NORMAL, levelStr, 198, y, colorIdx); } @@ -4250,13 +4250,13 @@ static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activityD break; case ACTIVITY_TRADE | IN_UNION_ROOM: ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3); - StringCopy(uroom->activityRequestStrbufs[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]); + StringCopy(uroom->activityRequestStrbufs[1], GetSpeciesName(sUnionRoomTrade.playerSpecies)); for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuLinkStatus->partner[i].serialNo == RFU_SERIAL_GAME) { ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[2], activityData[2], STR_CONV_MODE_LEFT_ALIGN, 3); - StringCopy(uroom->activityRequestStrbufs[3], gSpeciesNames[activityData[1]]); + StringCopy(uroom->activityRequestStrbufs[3], GetSpeciesName(activityData[1])); species = activityData[1]; break; } From 1562280bce541ef23a1508d88b0e28648623a155 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 7 Jul 2023 14:50:01 -0400 Subject: [PATCH 026/111] Fixed SPECIES_NONE icon --- graphics/pokemon/question_mark/icon.png | Bin 313 -> 289 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/question_mark/icon.png b/graphics/pokemon/question_mark/icon.png index a6456901bc18f9b94f393901c50b90ea610de8dc..97407de0d3cd367bd2b6b7f871a97be0c14c9d48 100644 GIT binary patch delta 220 zcmdnVw2*0n3Wq^}Pl#)43(G`(-THN0`}r6c7z9d!{DK+&qk;ng-OfO{37#&FAs(G? zuUHE;DDbcZl|Bm(PVtuZ uBfo)nsp=ZsYsb^QjEeUm-iLS}eyj^5BnZhT&-=3g0000 Date: Sun, 9 Jul 2023 14:57:51 -0400 Subject: [PATCH 027/111] Sync castform folder organization --- .../anim_front.png} | Bin .../{back_normal_form.png => normal/back.png} | Bin .../front.png} | Bin .../normal.pal} | 0 .../shiny.pal} | 0 .../anim_front.png} | Bin .../{back_rainy_form.png => rainy/back.png} | Bin .../{front_rainy_form.png => rainy/front.png} | Bin .../normal.pal} | 0 .../{shiny_rainy_form.pal => rainy/shiny.pal} | 0 .../anim_front.png} | Bin .../{back_snowy_form.png => snowy/back.png} | Bin .../{front_snowy_form.png => snowy/front.png} | Bin .../normal.pal} | 0 .../{shiny_snowy_form.pal => snowy/shiny.pal} | 0 .../anim_front.png} | Bin .../{back_sunny_form.png => sunny/back.png} | Bin .../{front_sunny_form.png => sunny/front.png} | Bin .../normal.pal} | 0 .../{shiny_sunny_form.pal => sunny/shiny.pal} | 0 graphics_file_rules.mk | 40 +++++++++--------- 21 files changed, 20 insertions(+), 20 deletions(-) rename graphics/pokemon/castform/{anim_front_normal_form.png => normal/anim_front.png} (100%) rename graphics/pokemon/castform/{back_normal_form.png => normal/back.png} (100%) rename graphics/pokemon/castform/{front_normal_form.png => normal/front.png} (100%) rename graphics/pokemon/castform/{normal_normal_form.pal => normal/normal.pal} (100%) rename graphics/pokemon/castform/{shiny_normal_form.pal => normal/shiny.pal} (100%) rename graphics/pokemon/castform/{anim_front_rainy_form.png => rainy/anim_front.png} (100%) rename graphics/pokemon/castform/{back_rainy_form.png => rainy/back.png} (100%) rename graphics/pokemon/castform/{front_rainy_form.png => rainy/front.png} (100%) rename graphics/pokemon/castform/{normal_rainy_form.pal => rainy/normal.pal} (100%) rename graphics/pokemon/castform/{shiny_rainy_form.pal => rainy/shiny.pal} (100%) rename graphics/pokemon/castform/{anim_front_snowy_form.png => snowy/anim_front.png} (100%) rename graphics/pokemon/castform/{back_snowy_form.png => snowy/back.png} (100%) rename graphics/pokemon/castform/{front_snowy_form.png => snowy/front.png} (100%) rename graphics/pokemon/castform/{normal_snowy_form.pal => snowy/normal.pal} (100%) rename graphics/pokemon/castform/{shiny_snowy_form.pal => snowy/shiny.pal} (100%) rename graphics/pokemon/castform/{anim_front_sunny_form.png => sunny/anim_front.png} (100%) rename graphics/pokemon/castform/{back_sunny_form.png => sunny/back.png} (100%) rename graphics/pokemon/castform/{front_sunny_form.png => sunny/front.png} (100%) rename graphics/pokemon/castform/{normal_sunny_form.pal => sunny/normal.pal} (100%) rename graphics/pokemon/castform/{shiny_sunny_form.pal => sunny/shiny.pal} (100%) diff --git a/graphics/pokemon/castform/anim_front_normal_form.png b/graphics/pokemon/castform/normal/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_normal_form.png rename to graphics/pokemon/castform/normal/anim_front.png diff --git a/graphics/pokemon/castform/back_normal_form.png b/graphics/pokemon/castform/normal/back.png similarity index 100% rename from graphics/pokemon/castform/back_normal_form.png rename to graphics/pokemon/castform/normal/back.png diff --git a/graphics/pokemon/castform/front_normal_form.png b/graphics/pokemon/castform/normal/front.png similarity index 100% rename from graphics/pokemon/castform/front_normal_form.png rename to graphics/pokemon/castform/normal/front.png diff --git a/graphics/pokemon/castform/normal_normal_form.pal b/graphics/pokemon/castform/normal/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_normal_form.pal rename to graphics/pokemon/castform/normal/normal.pal diff --git a/graphics/pokemon/castform/shiny_normal_form.pal b/graphics/pokemon/castform/normal/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_normal_form.pal rename to graphics/pokemon/castform/normal/shiny.pal diff --git a/graphics/pokemon/castform/anim_front_rainy_form.png b/graphics/pokemon/castform/rainy/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_rainy_form.png rename to graphics/pokemon/castform/rainy/anim_front.png diff --git a/graphics/pokemon/castform/back_rainy_form.png b/graphics/pokemon/castform/rainy/back.png similarity index 100% rename from graphics/pokemon/castform/back_rainy_form.png rename to graphics/pokemon/castform/rainy/back.png diff --git a/graphics/pokemon/castform/front_rainy_form.png b/graphics/pokemon/castform/rainy/front.png similarity index 100% rename from graphics/pokemon/castform/front_rainy_form.png rename to graphics/pokemon/castform/rainy/front.png diff --git a/graphics/pokemon/castform/normal_rainy_form.pal b/graphics/pokemon/castform/rainy/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_rainy_form.pal rename to graphics/pokemon/castform/rainy/normal.pal diff --git a/graphics/pokemon/castform/shiny_rainy_form.pal b/graphics/pokemon/castform/rainy/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_rainy_form.pal rename to graphics/pokemon/castform/rainy/shiny.pal diff --git a/graphics/pokemon/castform/anim_front_snowy_form.png b/graphics/pokemon/castform/snowy/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_snowy_form.png rename to graphics/pokemon/castform/snowy/anim_front.png diff --git a/graphics/pokemon/castform/back_snowy_form.png b/graphics/pokemon/castform/snowy/back.png similarity index 100% rename from graphics/pokemon/castform/back_snowy_form.png rename to graphics/pokemon/castform/snowy/back.png diff --git a/graphics/pokemon/castform/front_snowy_form.png b/graphics/pokemon/castform/snowy/front.png similarity index 100% rename from graphics/pokemon/castform/front_snowy_form.png rename to graphics/pokemon/castform/snowy/front.png diff --git a/graphics/pokemon/castform/normal_snowy_form.pal b/graphics/pokemon/castform/snowy/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_snowy_form.pal rename to graphics/pokemon/castform/snowy/normal.pal diff --git a/graphics/pokemon/castform/shiny_snowy_form.pal b/graphics/pokemon/castform/snowy/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_snowy_form.pal rename to graphics/pokemon/castform/snowy/shiny.pal diff --git a/graphics/pokemon/castform/anim_front_sunny_form.png b/graphics/pokemon/castform/sunny/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_sunny_form.png rename to graphics/pokemon/castform/sunny/anim_front.png diff --git a/graphics/pokemon/castform/back_sunny_form.png b/graphics/pokemon/castform/sunny/back.png similarity index 100% rename from graphics/pokemon/castform/back_sunny_form.png rename to graphics/pokemon/castform/sunny/back.png diff --git a/graphics/pokemon/castform/front_sunny_form.png b/graphics/pokemon/castform/sunny/front.png similarity index 100% rename from graphics/pokemon/castform/front_sunny_form.png rename to graphics/pokemon/castform/sunny/front.png diff --git a/graphics/pokemon/castform/normal_sunny_form.pal b/graphics/pokemon/castform/sunny/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_sunny_form.pal rename to graphics/pokemon/castform/sunny/normal.pal diff --git a/graphics/pokemon/castform/shiny_sunny_form.pal b/graphics/pokemon/castform/sunny/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_sunny_form.pal rename to graphics/pokemon/castform/sunny/shiny.pal diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 97a7794b3..090620ebe 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -30,34 +30,34 @@ contest_types := cool beauty cute smart tough ### Castform ### -$(CASTFORMGFXDIR)/front.4bpp: $(CASTFORMGFXDIR)/front_normal_form.4bpp \ - $(CASTFORMGFXDIR)/front_sunny_form.4bpp \ - $(CASTFORMGFXDIR)/front_rainy_form.4bpp \ - $(CASTFORMGFXDIR)/front_snowy_form.4bpp +$(CASTFORMGFXDIR)/front.4bpp: $(CASTFORMGFXDIR)/normal/front.4bpp \ + $(CASTFORMGFXDIR)/sunny/front.4bpp \ + $(CASTFORMGFXDIR)/rainy/front.4bpp \ + $(CASTFORMGFXDIR)/snowy/front.4bpp @cat $^ >$@ -$(CASTFORMGFXDIR)/back.4bpp: $(CASTFORMGFXDIR)/back_normal_form.4bpp \ - $(CASTFORMGFXDIR)/back_sunny_form.4bpp \ - $(CASTFORMGFXDIR)/back_rainy_form.4bpp \ - $(CASTFORMGFXDIR)/back_snowy_form.4bpp +$(CASTFORMGFXDIR)/back.4bpp: $(CASTFORMGFXDIR)/normal/back.4bpp \ + $(CASTFORMGFXDIR)/sunny/back.4bpp \ + $(CASTFORMGFXDIR)/rainy/back.4bpp \ + $(CASTFORMGFXDIR)/snowy/back.4bpp @cat $^ >$@ -$(CASTFORMGFXDIR)/anim_front.4bpp: $(CASTFORMGFXDIR)/anim_front_normal_form.4bpp \ - $(CASTFORMGFXDIR)/anim_front_sunny_form.4bpp \ - $(CASTFORMGFXDIR)/anim_front_rainy_form.4bpp \ - $(CASTFORMGFXDIR)/anim_front_snowy_form.4bpp +$(CASTFORMGFXDIR)/anim_front.4bpp: $(CASTFORMGFXDIR)/normal/anim_front.4bpp \ + $(CASTFORMGFXDIR)/sunny/anim_front.4bpp \ + $(CASTFORMGFXDIR)/rainy/anim_front.4bpp \ + $(CASTFORMGFXDIR)/snowy/anim_front.4bpp @cat $^ >$@ -$(CASTFORMGFXDIR)/normal.gbapal: $(CASTFORMGFXDIR)/normal_normal_form.gbapal \ - $(CASTFORMGFXDIR)/normal_sunny_form.gbapal \ - $(CASTFORMGFXDIR)/normal_rainy_form.gbapal \ - $(CASTFORMGFXDIR)/normal_snowy_form.gbapal +$(CASTFORMGFXDIR)/normal.gbapal: $(CASTFORMGFXDIR)/normal/normal.gbapal \ + $(CASTFORMGFXDIR)/sunny/normal.gbapal \ + $(CASTFORMGFXDIR)/rainy/normal.gbapal \ + $(CASTFORMGFXDIR)/snowy/normal.gbapal @cat $^ >$@ -$(CASTFORMGFXDIR)/shiny.gbapal: $(CASTFORMGFXDIR)/shiny_normal_form.gbapal \ - $(CASTFORMGFXDIR)/shiny_sunny_form.gbapal \ - $(CASTFORMGFXDIR)/shiny_rainy_form.gbapal \ - $(CASTFORMGFXDIR)/shiny_snowy_form.gbapal +$(CASTFORMGFXDIR)/shiny.gbapal: $(CASTFORMGFXDIR)/normal/shiny.gbapal \ + $(CASTFORMGFXDIR)/sunny/shiny.gbapal \ + $(CASTFORMGFXDIR)/rainy/shiny.gbapal \ + $(CASTFORMGFXDIR)/snowy/shiny.gbapal @cat $^ >$@ From 5fd881a1b68b62679452591a6299fad0668db2e9 Mon Sep 17 00:00:00 2001 From: gruxor Date: Wed, 12 Jul 2023 14:44:23 -0400 Subject: [PATCH 028/111] Remove unused macro to fix syntax highlights --- include/global.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/global.h b/include/global.h index 184abdbe4..0ca226c03 100644 --- a/include/global.h +++ b/include/global.h @@ -20,7 +20,6 @@ #define BLOCK_CROSS_JUMP asm(""); // to help in decompiling -#define asm_comment(x) asm volatile("@ -- " x " -- ") #define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided") #define NAKED __attribute__((naked)) From cb66e8b770f117a6e33c6b5e66907d8740790832 Mon Sep 17 00:00:00 2001 From: sbird Date: Thu, 13 Jul 2023 23:43:02 +0200 Subject: [PATCH 029/111] [battle, fpmath] revert changes to Q_24_8 format --- include/fpmath.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/fpmath.h b/include/fpmath.h index 7e25a92a4..987c59d5a 100644 --- a/include/fpmath.h +++ b/include/fpmath.h @@ -1,7 +1,7 @@ #ifndef FPMATH_H_ #define FPMATH_H_ -typedef s32 q4_12_t; +typedef s16 q4_12_t; typedef u32 uq4_12_t; #define Q_4_12_SHIFT (12) @@ -15,7 +15,7 @@ typedef u32 uq4_12_t; #define UQ_4_12(n) ((uq4_12_t)((n) * 4096)) // Converts a number to Q24.8 fixed-point format -#define Q_24_8(n) ((s32)((n) * 256)) +#define Q_24_8(n) ((s32)((n) << 8)) // Converts a Q8.8 fixed-point format number to a regular integer #define Q_8_8_TO_INT(n) ((s32)((n) / 256)) @@ -25,7 +25,7 @@ typedef u32 uq4_12_t; #define UQ_4_12_TO_INT(n) ((u32)((n) / 4096)) // Converts a Q24.8 fixed-point format number to a regular integer -#define Q_24_8_TO_INT(n) ((s32)((n) / 256)) +#define Q_24_8_TO_INT(n) ((s32)((n) >> 8)) // Rounding value for Q4.12 fixed-point format #define Q_4_12_ROUND ((1) << (Q_4_12_SHIFT - 1)) From 0c0b841a80877fca5ca47bf9475df9959a3b0499 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 14 Jul 2023 00:47:01 +0200 Subject: [PATCH 030/111] Remove debug item effect override (#3106) --- include/battle.h | 1 - src/battle_debug.c | 22 +++------------------- src/battle_util.c | 10 ---------- src/battle_z_move.c | 5 ----- 4 files changed, 3 insertions(+), 35 deletions(-) diff --git a/include/battle.h b/include/battle.h index 9995a2a24..29f33753a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -621,7 +621,6 @@ struct BattleStruct u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages u8 lastMoveFailed; // as bits for each battler, for the sake of Stomping Tantrum u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct - u8 debugHoldEffects[MAX_BATTLERS_COUNT]; // These override actual items' hold effects. u16 tracedAbility[MAX_BATTLERS_COUNT]; u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk bool8 spriteIgnore0Hp; diff --git a/src/battle_debug.c b/src/battle_debug.c index 5712c9881..3e704b586 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -137,7 +137,6 @@ enum VAR_IN_LOVE, VAR_U16_4_ENTRIES, VAL_S8, - VAL_ITEM, VAL_ALL_STAT_STAGES, }; @@ -246,7 +245,6 @@ static const u8 sText_InLove[] = _("In Love"); static const u8 sText_AIMovePts[] = _("AI Pts/Dmg"); static const u8 sText_AiKnowledge[] = _("AI Info"); static const u8 sText_AiParty[] = _("AI Party"); -static const u8 sText_EffectOverride[] = _("Effect Override"); static const u8 sText_EmptyString[] = _(""); @@ -1302,7 +1300,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = 1; break; case LIST_ITEM_HELD_ITEM: - itemsCount = 2; + itemsCount = 1; break; case LIST_ITEM_TYPES: itemsCount = 3; @@ -1440,11 +1438,6 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) PadString(ItemId_GetName(gBattleMons[data->battlerId].item), text); printer.currentY = printer.y = sSecondaryListTemplate.upText_Y; AddTextPrinter(&printer, 0, NULL); - - PadString(sText_EffectOverride, text); - printer.fontId = 0; - printer.currentY = printer.y = sSecondaryListTemplate.upText_Y + yMultiplier; - AddTextPrinter(&printer, 0, NULL); break; case LIST_ITEM_TYPES: for (i = 0; i < 3; i++) @@ -1586,12 +1579,6 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) gBattleMons[data->battlerId].status2 &= ~STATUS2_INFATUATION; } break; - case VAL_ITEM: - if (data->currentSecondaryListItemId == 0) - *(u16 *)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; - else if (data->currentSecondaryListItemId == 1) - gBattleStruct->debugHoldEffects[data->battlerId] = data->modifyArrows.currValue; - break; } data->battlerWasChanged[data->battlerId] = TRUE; } @@ -1800,11 +1787,8 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.maxValue = ITEMS_COUNT - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].item; - data->modifyArrows.typeOfVal = VAL_ITEM; - if (data->currentSecondaryListItemId == 0) - data->modifyArrows.currValue = gBattleMons[data->battlerId].item; - else - data->modifyArrows.currValue = gBattleStruct->debugHoldEffects[data->battlerId]; + data->modifyArrows.typeOfVal = VAL_U16; + data->modifyArrows.currValue = gBattleMons[data->battlerId].item; break; case LIST_ITEM_TYPES: data->modifyArrows.minValue = 0; diff --git a/src/battle_util.c b/src/battle_util.c index 438d98016..c00f9036d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8060,11 +8060,6 @@ u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating) gPotentialItemEffectBattler = battlerId; -#if DEBUG_BATTLE_MENU == TRUE - if (gBattleStruct->debugHoldEffects[battlerId] != 0 && gBattleMons[battlerId].item) - return gBattleStruct->debugHoldEffects[battlerId]; - else -#endif if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY_E_READER) return gEnigmaBerries[battlerId].holdEffect; else @@ -9986,11 +9981,6 @@ bool32 CanMegaEvolve(u8 battlerId) // Check if there is an entry in the evolution table for regular Mega Evolution. if (GetBattleFormChangeTargetSpecies(battlerId, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM) != SPECIES_NONE) { - #if DEBUG_BATTLE_MENU == TRUE - if (gBattleStruct->debugHoldEffects[battlerId]) - holdEffect = gBattleStruct->debugHoldEffects[battlerId]; - else - #endif if (itemId == ITEM_ENIGMA_BERRY_E_READER) holdEffect = gEnigmaBerries[battlerId].holdEffect; else diff --git a/src/battle_z_move.c b/src/battle_z_move.c index dec3701c0..55cc157be 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -194,11 +194,6 @@ bool32 IsViableZMove(u8 battlerId, u16 move) return FALSE; // Partner has mega evolved or is about to mega evolve } -#if DEBUG_BATTLE_MENU == TRUE - if (gBattleStruct->debugHoldEffects[battlerId]) - holdEffect = gBattleStruct->debugHoldEffects[battlerId]; - else -#endif if (item == ITEM_ENIGMA_BERRY_E_READER) return FALSE; // HoldEffect = gEnigmaBerries[battlerId].holdEffect; else From 5f29ae6f998616da2759707e17f58f09c69caeca Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Fri, 14 Jul 2023 05:17:54 -0400 Subject: [PATCH 031/111] Failed tests are now listed in the total (#3073) * Failed tests are now listed in the total --- include/test_runner.h | 3 +- test/test_runner_battle.c | 11 ++++++++ tools/mgba-rom-test-hydra/main.c | 47 ++++++++++++++++++++++++++++---- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/include/test_runner.h b/include/test_runner.h index 91f6f8f43..fddd4d656 100644 --- a/include/test_runner.h +++ b/include/test_runner.h @@ -3,11 +3,10 @@ extern const bool8 gTestRunnerEnabled; extern const bool8 gTestRunnerHeadless; +extern const bool8 gTestRunnerSkipIsFail; #if TESTING -extern const bool8 gTestRunnerSkipIsFail; - void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability); void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId); void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP); diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 6c8972bae..592d0db98 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -10,6 +10,17 @@ #include "test_battle.h" #include "window.h" +#if defined(__INTELLISENSE__) +#undef TestRunner_Battle_RecordAbilityPopUp +#undef TestRunner_Battle_RecordAnimation +#undef TestRunner_Battle_RecordHP +#undef TestRunner_Battle_RecordMessage +#undef TestRunner_Battle_RecordStatus1 +#undef TestRunner_Battle_AfterLastTurn +#undef TestRunner_Battle_CheckBattleRecordActionType +#undef TestRunner_Battle_GetForcedAbility +#endif + #define INVALID(fmt, ...) Test_ExitWithResult(TEST_RESULT_INVALID, "%s:%d: " fmt, gTestRunnerState.test->filename, sourceLine, ##__VA_ARGS__) #define INVALID_IF(c, fmt, ...) do { if (c) Test_ExitWithResult(TEST_RESULT_INVALID, "%s:%d: " fmt, gTestRunnerState.test->filename, sourceLine, ##__VA_ARGS__); } while (0) diff --git a/tools/mgba-rom-test-hydra/main.c b/tools/mgba-rom-test-hydra/main.c index 48071ef8f..7151255de 100644 --- a/tools/mgba-rom-test-hydra/main.c +++ b/tools/mgba-rom-test-hydra/main.c @@ -31,7 +31,11 @@ #include #include -#define MAX_PROCESSES 32 // See also test/test.h +#define min(a, b) ((a) < (b) ? (a) : (b)) + +#define MAX_PROCESSES 32 // See also test/test.h +#define MAX_FAILED_TESTS_TO_LIST 100 +#define MAX_TEST_LIST_BUFFER_LENGTH 256 struct Runner { @@ -51,6 +55,7 @@ struct Runner int assumptionFails; int fails; int results; + char failedTestNames[MAX_FAILED_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; }; static unsigned nrunners = 0; @@ -99,6 +104,8 @@ static void handle_read(int i, struct Runner *runner) runner->assumptionFails++; goto add_to_results; case 'F': + if (runner->fails < MAX_FAILED_TESTS_TO_LIST) + strcpy(runner->failedTestNames[runner->fails], runner->test_name); runner->fails++; add_to_results: runner->results++; @@ -182,6 +189,14 @@ static void exit2(int _) exit(2); } +int compare_strings(const void * a, const void * b) +{ + const char *arg1 = (const char *) a; + const char *arg2 = (const char *) b; + + return strcmp(arg1, arg2); +} + int main(int argc, char *argv[]) { if (argc < 4) @@ -476,6 +491,9 @@ int main(int argc, char *argv[]) int assumptionFails = 0; int fails = 0; int results = 0; + + char failedTestNames[MAX_FAILED_TESTS_TO_LIST * MAX_PROCESSES][MAX_TEST_LIST_BUFFER_LENGTH]; + for (int i = 0; i < nrunners; i++) { int wstatus; @@ -492,26 +510,45 @@ int main(int argc, char *argv[]) knownFails += runners[i].knownFails; todos += runners[i].todos; assumptionFails += runners[i].assumptionFails; - fails += runners[i].fails; + for (int j = 0; j < runners[i].fails; j++) + { + if (j < MAX_FAILED_TESTS_TO_LIST) + strcpy(failedTestNames[fails], runners[i].failedTestNames[j]); + fails++; + } results += runners[i].results; } + qsort(failedTestNames, min(fails, MAX_FAILED_TESTS_TO_LIST), sizeof(char) * MAX_TEST_LIST_BUFFER_LENGTH, compare_strings); + if (results == 0) { fprintf(stdout, "\nNo tests found.\n"); } else { - fprintf(stdout, "\n- Tests TOTAL: %d\n", results); + if (fails > 0) + { + fprintf(stdout, "\n- Tests \e[31mFAILED\e[0m : %d Add TESTS='X' to run tests with the defined prefix.\n", fails); + for (int i = 0; i < fails; i++) + { + if (i >= MAX_FAILED_TESTS_TO_LIST) + { + fprintf(stdout, " - \e[31mand %d more...\e[0m\n", fails - MAX_FAILED_TESTS_TO_LIST); + break; + } + fprintf(stdout, " - \e[31m%s\e[0m.\n", failedTestNames[i]); + } + } fprintf(stdout, "- Tests \e[32mPASSED\e[0m: %d\n", passes); if (knownFails > 0) fprintf(stdout, "- Tests \e[33mKNOWN_FAILING\e[0m: %d\n", knownFails); if (todos > 0) fprintf(stdout, "- Tests \e[33mTO_DO\e[0m: %d\n", todos); - if (fails > 0) - fprintf(stdout, "- Tests \e[31mFAILED\e[0m : %d\n", fails); if (assumptionFails > 0) fprintf(stdout, "- \e[33mASSUMPTIONS_FAILED\e[0m: %d\n", assumptionFails); + + fprintf(stdout, "- Tests \e[34mTOTAL\e[0m: %d\n", results); } fprintf(stdout, "\n"); From e1f2320f2e729685ff4bcccdf044d148db5cfe27 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Fri, 14 Jul 2023 07:27:52 -0400 Subject: [PATCH 032/111] Delete unneeded workflow --- .github/workflows/manual.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .github/workflows/manual.yml diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml deleted file mode 100644 index 0d724c4a4..000000000 --- a/.github/workflows/manual.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Close issues related to a merged pull request based on master branch. - -on: - pull_request: - types: [closed] - branches: - - upcoming - -jobs: - closeIssueOnPrMergeTrigger: - - runs-on: ubuntu-latest - - steps: - - name: Closes issues related to a merged pull request. - uses: ldez/gha-mjolnir@v1.0.3 From d4bb1dffd7ba4d99b211b3c2d26d7c577093bea2 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Fri, 14 Jul 2023 07:28:41 -0400 Subject: [PATCH 033/111] Delete unneeded workflow --- .github/workflows/manual.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .github/workflows/manual.yml diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml deleted file mode 100644 index 0d724c4a4..000000000 --- a/.github/workflows/manual.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Close issues related to a merged pull request based on master branch. - -on: - pull_request: - types: [closed] - branches: - - upcoming - -jobs: - closeIssueOnPrMergeTrigger: - - runs-on: ubuntu-latest - - steps: - - name: Closes issues related to a merged pull request. - uses: ldez/gha-mjolnir@v1.0.3 From 240f41fc589cacb27a11cb4727c6b96fe1b862d6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 14 Jul 2023 10:53:40 -0400 Subject: [PATCH 034/111] Reverted BattleMove power to u8 Nothing was using it, despite what the comment suggested --- include/pokemon.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/pokemon.h b/include/pokemon.h index 022c155ae..56359d882 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -337,7 +337,7 @@ struct SpeciesInfo /*0x24*/ struct BattleMove { u16 effect; - u16 power; //higher than 255 for z moves + u8 power; u8 type; u8 accuracy; u8 pp; From 96159d189f60e351c407dbc1e5433156ccd28252 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 14 Jul 2023 16:26:19 +0100 Subject: [PATCH 035/111] Clear fixedPopup when gTestRunnerHeadless (#3133) Previously fixedPopup = FALSE was unconditional, but it was erroneously changed in f1b9872bf0a. --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index 1a4909818..3e6029ab7 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3188,8 +3188,8 @@ void DestroyAbilityPopUp(u8 battlerId) { gSprites[gBattleStruct->abilityPopUpSpriteIds[battlerId][0]].tFrames = 0; gSprites[gBattleStruct->abilityPopUpSpriteIds[battlerId][1]].tFrames = 0; - gBattleScripting.fixedPopup = FALSE; } + gBattleScripting.fixedPopup = FALSE; } static void Task_FreeAbilityPopUpGfx(u8 taskId) From 6382640f8a05d906194cd877d9aab117dc841bdf Mon Sep 17 00:00:00 2001 From: SonikkuA-DatH <58025603+SonikkuA-DatH@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:45:40 -0700 Subject: [PATCH 036/111] Castform, Cherrim Sun, Spinda, and Spheal Graphical Tweaks (#3127) * Casrform graphics. Palette changes, edited backs, and 2 Frame anims * Castform Graphics * Cherrim graphics, and Castform redefinitions * Spheal and Spinda Graphic edits. Spheal mouth adjustment, Spinda 2 frame and palette * Revised Spinda Spot drawing function, removed tabs * Animations for Castform forms, Spinda, Cherrim Sun, and Spheal set * Spacing * Forgot shiny pal. Fixed * Delete .vs directory * remove vs ref --- graphics/pokemon/castform/anim_front.png | Bin 0 -> 7222 bytes graphics/pokemon/castform/back.png | Bin 374 -> 7525 bytes graphics/pokemon/castform/front.png | Bin 386 -> 0 bytes graphics/pokemon/castform/normal.pal | 14 +- .../pokemon/castform/rainy/anim_front.png | Bin 0 -> 10405 bytes graphics/pokemon/castform/rainy/back.png | Bin 468 -> 9182 bytes graphics/pokemon/castform/rainy/front.png | Bin 506 -> 0 bytes graphics/pokemon/castform/rainy/normal.pal | 24 +-- graphics/pokemon/castform/rainy/shiny.pal | 26 +-- graphics/pokemon/castform/shiny.pal | 18 +- .../pokemon/castform/snowy/anim_front.png | Bin 0 -> 12943 bytes graphics/pokemon/castform/snowy/back.png | Bin 596 -> 10555 bytes graphics/pokemon/castform/snowy/front.png | Bin 665 -> 0 bytes graphics/pokemon/castform/snowy/normal.pal | 14 +- graphics/pokemon/castform/snowy/shiny.pal | 24 +-- .../pokemon/castform/sunny/anim_front.png | Bin 0 -> 12547 bytes graphics/pokemon/castform/sunny/back.png | Bin 553 -> 10105 bytes graphics/pokemon/castform/sunny/front.png | Bin 607 -> 0 bytes graphics/pokemon/castform/sunny/normal.pal | 22 +-- graphics/pokemon/castform/sunny/shiny.pal | 20 +-- graphics/pokemon/cherrim/normal/front.png | Bin 533 -> 0 bytes .../pokemon/cherrim/sunshine/anim_front.png | Bin 599 -> 11320 bytes graphics/pokemon/cherrim/sunshine/front.png | Bin 599 -> 0 bytes graphics/pokemon/spheal/anim_front.png | Bin 751 -> 9677 bytes graphics/pokemon/spinda/anim_front.png | Bin 668 -> 10744 bytes graphics/pokemon/spinda/back.png | Bin 677 -> 10353 bytes graphics/pokemon/spinda/normal.pal | 18 +- graphics/pokemon/spinda/shiny.pal | 18 +- include/pokemon.h | 2 +- src/data/graphics/pokemon.h | 10 +- src/data/pokemon_graphics/front_pic_anims.h | 85 ++++++---- src/decompress.c | 6 +- src/pokemon.c | 158 ++++++++---------- src/pokemon_animation.c | 8 +- 34 files changed, 241 insertions(+), 226 deletions(-) create mode 100644 graphics/pokemon/castform/anim_front.png delete mode 100644 graphics/pokemon/castform/front.png create mode 100644 graphics/pokemon/castform/rainy/anim_front.png delete mode 100644 graphics/pokemon/castform/rainy/front.png create mode 100644 graphics/pokemon/castform/snowy/anim_front.png delete mode 100644 graphics/pokemon/castform/snowy/front.png create mode 100644 graphics/pokemon/castform/sunny/anim_front.png delete mode 100644 graphics/pokemon/castform/sunny/front.png delete mode 100644 graphics/pokemon/cherrim/normal/front.png delete mode 100644 graphics/pokemon/cherrim/sunshine/front.png diff --git a/graphics/pokemon/castform/anim_front.png b/graphics/pokemon/castform/anim_front.png new file mode 100644 index 0000000000000000000000000000000000000000..b737a1d49bb5258a330f3694d900c5df1209923c GIT binary patch literal 7222 zcmeHMc{r5q_aFOGmXwff8kJPD&oDDtvlkH(Q5v&oVrDd(y-=db5>eWesECv(OA$hd zNR~I1E&CQC%JzMzx3~BDegAo{>-YWdo$GpLp6A@>e9k$abME_k&NXLk_nJ#dZjc0l zKvI?#CU(HDA#eo?3jyDj4_MA1&?=t4gA>P&=mYjPO#xGUX;cu%x2-wR zh1Y|VHd!j*JBQ8+7pTO6>IYS8C;N9@=3UCEY39|=+E?LHAO`Ry?$qx46eyA>s`; zEQgaSM-AYaF$$Gmn$w@Jj#qm+f}SJ=Nn?_PdZ+SbZwS@Ce3YeKIG=x-5>r%sKhzSEJm6;u^Pnnv~eb*kNRAkbz z^!m+-F>DUsc|$Uz-n0nXtKVH*v3ytr`JS;UvN4{-ejMB7JbFQY=%kVGw6Acn?X{mm1u_f zyFFytKc*Gkn`d>__UwFfS$X@Mxs=(Pe$eTN0|&MkTgO|pxMyWo?6Heelpt#wT}Z#{ z+6WQKZb`L5C0tW37_4@y(~$e@VsCv-`dWBxl}TNc-1byW`##f<8`g)``U9Von!Mh-g;{}eJ%Fky4{;Tb!&kds@c40 zr`?maey_6x7J9EFlBciHrXpiY-I2{}J6H;h8YxKyOWT-6HQ~>08`QauHwB^D2K}Q4 zob4|q2YHO_3sY;_ZXd+UtZ(wm+{)??Z|#^H_wTluIjP$aiB~@Nux{$LlTlnP#JDwh zKKEK0ZEAB^)wtW+E&D2~xtEi4O|A?%U7sqwB8bA=udZAFRoh*|r7hY6U2|kM|7NR$ zbZq+DGp$ojn-~g@nkV%$_Bs*sxPxA-gF8bETMvnqY_Zm4UN<-2@*qkjVk}d3QSR~n zz3CZ|mW#RlWxZ{snfu$1WaWl6_g=7}7g7?(`A$==%15z}rJ&OVmjz-*TJ$rK?#28O_gE{7jne0|QXSuSfG`W`&pVBxQ zseAm4cl38BX^%FQxk{@Tja`YYOsE*zdvh~m*6dEMA769^(JLZAOoF}xTLHta|*`6@elt7HvRjJ(Uv zp57axA*}26#qsiRPS9Rio>{b*$b*I>VQ(9_HyGQMvTQV~B8NQhUa`)q-7=(7D;93_ zY_*0>a&q58Z;w-V@^Z{y9y@_uG3H?Q!H_AObs9~aIjzh}rA)qRL>*|^Pj z1KfZ7e7IzADeaK;d%}G;Z|1px+ZWk)Yf&*g_ZN?@ZfS}f9!R)VDc)tmgrgK9RwaZK z44EdotS@TvP?cY8OQpRo+94+wFGm%aQPt8{Pxobf0?T4HiEPhB8OX1Xo$ae3{N0QTup?y{079s6s;I5vAvY63c}2JA!SEH62cfJhSL5kLaUs|Kkq98QNf)y5}kNPDc77E)K0Q>QR3|I%PwWloofl z9~~7 zOnL$7$JW{av80DH#8|#b@1pOghzUB?22wZI!tx zpL;r&J_eC{=ifT6wLICeNG7>) zWNn@9e1fg0gIkF2l=^n>w-cD2V+~%MrntBooU_&DN~M0dQVg#UD;Slq8%Z!A%AJGR z-R2e;*sW2K9F=+fG)Ix7#t<$-cDkwwwCpj9?d*ZA4lu##5zzbqmRUGiaR7J7e^uVw z5*dNXp+lkxp}M>llW7gUmSnluR(GqqoR35WHG$}LdCIT-X`bAGJ5iFJ?W!fi@v<9q z%(7(_)Ji7!x1_ukCZu7kTsbq3BaA%t%FACxDiz9~WW)FeRmS}=X&DLLTiSw_x)Y2x z&|g0l|5|VKoP`NSm9!G8#wUZeJv(?Bwvc0||f{)uRf9^!)kJ#)i2<`Cp@bL-LTMo$$0^32PeJD<-DFNCpyNh>t=T! zKLxXxuj0Pz)p>0iE|R3AjY{|HMr1pU94R>ETy1;y?pY1~y?w>!xz1hBDxB{(ISnVx zhm}5i64ytlTT`BWS~yO2W6BxSwuiE}_iI#`@V}DO7Ktx!Y`SEXg;K%>sq%bdp`tiy082VE`!Py%j+wYG)&<=iQ(>P3rvV>QA2`RMF zt=olQKEcVFhftf$C*Q7<6zN=uEY=b`%?N47=H<2M?^O?8&3zmwq@p57GOam0*$&mmwMSr2jmYmKn>Hl`evEQUkCD=HjMJ&2RFE!ddJqJS|l3=9D^^`-Gp5PeCoE{jYh*qNC9 zgaDrOAV)bIZvq_d%H!$HNgQI0^*?G@xuh28ZYiWw14tA%0+(P}n3E z&6`7GGQi82M0X~aqX&Ti>)=1*qkCIh|AJ?*f3g7Z0rw?(!;vrqoKA=TZo%f5@&J&Z z0sU7CwgWI&!tE$*CYME`nDQtLj>hj0WYRBtZ!XJgB^@#ePVu790aZ5O75O)p=9bpB zzbuw1@SxGXSF8ZC|E9^IQU4P`oxy2a2Q+Nk|MCjX_~`euJ=K(SWWbdi@^N zG87qr!eH=NEQW}HlF>jQ7#%7OibGP6P(02Zk0+vVRClWT3KW?{Fk`alM4+5BI?;my z_hxvkEG!dFFtWAOgP>rDza+L^L=F`&0QLZlL1y}}|5|dO(JA&E;xeB|Z5$qn!s2wW zI20C-LI0)XNMW&oUR*{+B4Fqr$jgNx0OBuB1O~4(E`dn;;e<`(QOGNf0J|Sc zq@zTJ2L;&SKU?ZgIqkoc3#X04ph+YI6pcVFmkXf{b;l7=P&}2SjnbjIlicw?IR1ss zW>PsmL>9%!1IQG}256y`Y`|N8lBxCgXnc-RmYG7J&`<=>21o}aj)2x7V6hPR&t&1t zd-~68b>aVq58V}o-wpx5?uQIGT!6C*{_C*%$=5Q4|HIGEI{Xhk0MP$B`A7WzOV_`2 z{UZkck@COY^)Frjh=G5k{BL*tztJW6*SJGr0B=A(z%V1T`8ELwn{%NB9WkddeWI-tNlXyawT|T-nG&T5M303|R3>~^|OT{8j?Ih-D zO7G6-1bIzl-*CXS9IlLVOX>Clfu~S&ZBn4cIE}B)2f>Z%UG5hJP^8&>i#4=W@bU{= zR~@)~>)_jxCeUsr$VPt^X^)$WsyO`z>dpJKgaz}n;@i9kBI^*Nt8KY>iK+wnL5<&5 zNd{A6V9^JQe+rl%7LThk5>$lLmC>`J}ztj=EV&WzEdXyq+UOwK;kd9Yw5c!5@$ z`2nIOh3wv|pyHfj4SIdODXeo-zUg%j6m85^JbgluDGFkxnxVQi^nPgJtBAZvsO*&<6> zvy|+WNYJnUPHWjR zdy`B1dW{0U8iMaX9nSAr|1kMn{X=kC`VzKzg}?RHYIH+JoAPM!{o1={j?TZ9q@hyl z)?S^T4o(%7G%X+G&Ik!KtGeM1FFk!)HLvb~$RpLaPW)3$TT}A!hfYm4%mS)>{z`pW zyp_7iYUF~}5&~|*i`SKuR3ilAfFqkzE^hi?moC#j+78E0!XH;g3SKH6TiSS@^2|~3 zNJ#AzhulKY#>~5UxSeb*Bsx9Rezel*08{M@R`7M}F3GQ!PC;+qc@Ov0z`u)}UahYj zI6crQ7bq82Q@iiW0pyFfHH`ww3}53Sm8Q*3sqr=C5c$G1GtKmGydk%#YJkDz_JW0w zRo{x|rnxCiKAJX#QE*h?VNEaL=IJqgluGtb1}A z7ok1i`t_NRm54g<-r6(ML4_$Nxc7PH;@gI0lFvoGF1|G({HF4Ck9vd$XQQWig$S9` z@1=h1Y`v_eiiSR<)04U<@Yx^-x1hG$VQrH`{HN4hoz|odMy+s`vYWY0AIybnG)zid zHH;7;u-y>zbf*ZOf$(8yL*5cf9MKZHF()+hIINBKZy4O6dkg@$v!X}HGh}a_Cl(*-B7s`pinigY0t~f{X1{j?eAAZ54xqO@_oC2 zfwp_51F!PS5(l76vZhc*E(WCbJjIu$Cqg0 z>yd(Gvud#H`)dBRF4e6B4fT!yG-_=#46z+uE*&WE^&ytP@@1Ev&a*M_?E>_7_ z!InRIXG|8{ISIl=&gu%u4K^cnpNJB_Ja1n?S0B7&9?ltD9$&M3xVSnie@H{*VqMux z|HEMBgv6P&mq99SpWP>qeyea3uc&u*o@&2!uXcWvLLPllwlnvIisWvkp*xTK1ObMp zhnwqW%1(^HD-qZA&1a8H8>Q)ANi}+4(exg5{Ty!~H$fsVK_3_?S z&7>zJxw1nILUTlYMXAi3-t>OZ`Mztbx0G+s!XdM>*^(9WZZaXvC+G8K-Rp2enNmS{ zx-y|Lx~)>N9SUzx=sJBv_0KHbLmcn1BOJow(EyNjaSr>igDhf=Qj`qp;{d?UAByC3 zSbQn>tXThkm8x(2qli7=H5lyX@P1!d_l+YQIM#`z7fQjNXFm{`}`7QCy3TvqDW{P%iYj zqal@0GD$TcNnLqZ%&CY&y)DBD(PE0NNEKzP%Y+p#NF|}T!iG%F=c79HywGL zj|)3<+l{1O`WvpDN}ccFuo6n$xx{POVsqF2pdBYq4RA-AO?&K;0`25Uvmya}Ip~|x z`0dO4#=|chq(*a>@Oo>PZC=yU0-g?gxU*X}G+(ry^no!}iEG-$BNXS$Q1OgBlEe;0 z#|cG5#1v_(`k(?N3QlxIx0VT5>I&;$)JL7*IUF-p|DtDa7kxrva>-0ky6|lJb(H=f zC5~P*Snz_})*SmuV{f>9imXM%HDUPgeATOV9A*Mf`cA_Vzgb=@NkXGvm0^WDL&Ioi z<^sBHaqBX!Oh|75Kaa(WypMV+a^^ZB5e5)KmO)qPD(`&Tv160#m- z5YO(9sgN3=4TsA&mY$7O_I2d;PFh!2>b>t~yj(?;KA^oVJNd{6RWEftA*{MspYq)} z7_j@6Fvy{z0?n2$_}(X&y{ekBU%Tn5$%-H;DY%QRuVRtkmIpFiD8!jCppak^_;lb> zCoK{o*WlC|Gd^=Oc27R8#K2+1dC?xhd);|riZ7~IqF;A#aWIh63M%O4{JulvEmU0B zuVmOKro*N0WMjHJuTQyDY*4E2Qvx5R=AEtKWjiy41B}o27^{rOm#6Ex-`TZ)sZy6a zgmsvTGsd}=J-=Y_o=#n|cOX||F-X%-vF8gJ!gG@b$g=SI%up-21wkHcje$%u*uBjm zfY4%>GYy9{QFpz02&y<3@8Lm|XQQ?W@n`uhmShP(2yN1#$>_!Cv@Gcn!|rQ)H^20e zNHWFM!}E0Fm(dskr`|3#%8(hFi`{WrZm_RNayKkggcS$zp@S(UAmH7vVI?Pz8K z@0H3tO;5-@`TU9zwy4y!vnI>;`SI=~_xBd-Ib3>QD?e{g;up_k9&ZoSlK9||Kg1k6 zxErh(!O`a4}U}$JdGv zJYgUBi<~cfeJ2i-y>s2Tr;bwoZg-mV3+wvimLRf9vdhD{UeLVbg~FCoEof%pI?|k2qb$U74Mtugli2#uQKT zS#^(2eBgHQE`zsqaWE!RGxI$-Vv*ND+^}HCN@}V|%KZ&AQ_GxSh!lIykcC15^6Dp^ zEZ3ic_W=HGzblmr8eu4Yy$g?3>vD=Cm*qiv|z@)0UQwJ1-Ymo3awA^FHg0IiV z5@zUBwm;$J!Hv$6 zL|d_H-80I&xU*ANC)kY-pequ1cgZJwe*>DnD~oP5G)?%_hw^pPS3ui-8@JMUv@i0K zDak(uO&K>qhpV?eAM^_dOPuEp3WGpXkf^VyJ3iT}0yWVj(fAFy*Zm`O3&4B|!6c=a zU^Akm&}~WVrv=h_mq0g~Zd9o3^203(0kwTgHRJAP1um5ezw??Kh#Ck@dFRb7^3Z@T zL2W*@A#(Q|%>VK!;ZJ=z-fhpir1+Q?o3xx_4})SMrCmu{-drX5@>UOqzv7~`aGvMF z*RENI9l>^)hoB*aS6X-0Xr&W!9K)K%i4?|tyiPWVyfP+<3WtuM*bGaQA$;NQ>y*NTjV}otc;!J=D;OXng~}u z8277OT}nJ9L~_W{z|EUp_kc%Z)UMX_MhJ4IMV6Jv7lX!Y*($Jgg(Y1^sYO|M?OFcA zgG*KtxUw|6t_Gp(h>}KHa9&~31oAlgM))PKvJNgy)3`V60Jg*yq};2s9f@gIol>vJ zzeCRnH7h8`*&Dy;ypi>N+%Fmt${$%Pt*ZA#Or94}^f)mk+YNnU7K!wmytXQ`XMC4` zvh8}bbnqAPSKSt~<}dXOZQP1#kUE)5DdkfK@&bPd`;47=Qm5YIv^e#kC_hoR`3boN;n3qT99Ci; zDVECN0&*RhlNJ+Efpj}2kX24+V#wbMN6YG}^=aiNO&vj6G`_5$Nspn|Uq>8+k*9}b z89XN??^G{Xrp>(%KR&6IA#}yP_ruV!B+8jh*?Vc$9gfdz?X+#VBM_2Ef5+l|$#r&} z%ei%?1)mgd*!KV@BkI^Z2k@q{<@bizM|vum-aej5qQxer$9u$6bm#{UFoX@&`~}WG zm}F$Ma=}k5-bndfPIY&5`vz}H^!^?xYQ?vinQuymGa417#7ChN%Qn4>OI-2RU)H=o zIrlyzWe#UK@9CZq?n$h=CgFHSJEeG_c>|F4>P2^CkxgUx^5%}U&fvZ0_^!zS0Bm7o zZEZ6{ZS6mXAlB$}^Ymp^gGU+?%}$m%nR_Gm33|7gr7A?lppEukaLy>-Yv&8CUfO*f zaYz;t7wXa27~g#7{Drc+d+vq;zp{-@k7ZARq&F00%cDNMsghinSDhba)5>bHD)V4B zLq0KRCb%e9%I$O%)R5E?4Ff7!nr8n7|0v@`~_6?C(wpWT3>q2uw?Qx5CCDd1O2@`DRivADrg%Q%X;1tD}sRACJYZ%kPXfZs7>`D0TB=c1Pa#m zC;P!bYCJ#{AEGPPLPzf>1nW%|?1gtDDbgrz+lnp1v6^OvsvsBy`j^Da6VGsEIk5HsnL?y8 z>3^xL$X+B%27ZfAC1o^535LW#5m03W6b1Xs$eQFsXZ7M1suC0e|AD-_c; z$=fO*aJzA_c*2h$bi5ylxE+Y)_d`W+$5Y%$tR4QdrT&nU|I2bAU0^5-5()#uF)U^g zFgy{AcEJ$ANT`b|8sQ4VVDO~BqtmIb3?|-(r0K@0lvNF@g|@2!9{EY8?BDH~?xZcI zpfETXiUKPsSt+5ha5NT%04e?~R&i@j|52@q;{V}8W!vDFLxAP?L&iE>SZ9^upNG{? zzP2d*AAWwW!~ZY>3;N$6|A^mz>H3$hf5gB)GXA%_{-x_5G4PL!|Lv~-H@bNK8h1z( z)-NC?YnZt>b99n52tmz^t#q54ui6;V8?rjbS|&F~H(BD(vy_>~#$T>gw`nGC%}W44 z2BZ9#mi^}Drl_c>TS}c5OSFq-U`q!8b_;J^Y=G-GMOi{Fh9ORuYm$qX?Xc*)Z~~Jx z7xNqHXj&Px&RtcFYk~@dr>g0Om^9e9h#v}*%#11D@sOWnbT{H`FLOxBbD7hY!?4W= zPKc&R=f*6l)dhsacy$JiF4oJ0vHm0~Sa~Q*ROKhlt?RwIJa{17h&WWdbn~~VqsBX! zy_P^h5TDI$4!6DB8LhNd_%Cl8{@)#MzQaCcO`+kwVJEuj!V|Hf%{ce9?RrPzziDr oB`$k)6Te+uUw31>uHK+{GurvLeokc|i!Femu8GcFE$7hx0DzghuX-(CCyf4G&9p{2W+t#iDfj{0I8SCa3&okz5=vf)au*Af2 zqLz<9DJO?V$HB5mCnVTdGSht*2|iq-y^vY*y*$(LU*!r4Z@SChva?um<=*9IP*e6} zoTO;8hv6G*3Dd3j91&gq3~#t18XvKiG0xt_@P=)J?9qQqrlhkZ?0C-IP|vG#@VA`q zfxn88KSdL`-rcX1GH5w5@0zgE-+2PBPp`ajZE>yYJvM{n4>17?%)YM>64NX0VB&dh orf__B9P{Y|e{OnwY0G)Qsyvss=)(6*Q&1pzy85}Sb4q9e0GrCC7ytkO diff --git a/graphics/pokemon/castform/front.png b/graphics/pokemon/castform/front.png deleted file mode 100644 index c21ab589bcf9e5030e071676ed111ed803f83e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 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 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/castform/rainy/back.png b/graphics/pokemon/castform/rainy/back.png index bd7ac7d7ce21002dff974c8c7433de2d0dd1bc32..9fa76ba8af840f8e77254bcee333392f45790d00 100644 GIT binary patch literal 9182 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 delta 454 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 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/castform/snowy/back.png b/graphics/pokemon/castform/snowy/back.png index 6b8946b351b75a2b5d823e572f8e62e266d79d8f..d8ab4e38af2d7f42cfe4c5d8f69e66eefa2b2b37 100644 GIT binary patch literal 10555 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 delta 583 zcmV-N0=WIVQq%;H7=H)@0001;w}I>c001yhOjJd50CUB~lqpgVwV00F~EL_t(oh3%HxZp0uAL@N^|#$mPp|F;Fq#eW0?*{bbRX5S*_#9;4` zudhds9zA;W4{}mJ@t#tjVEjTnRpA}R&|Me{KW0C+5{Nr~@35^Z0%7V$_S;^ywlSdq zg2921iv(N%Twa6V{aK=fT;F>DfV#%NvvqsH3=lgE^)2VgrK^4wU}MotXeNQX=vn+6 zb$@(2GhBxNc7J1;4gClpzh3->cpGAzZ1|0i&_OzBscR!9{!m0YGrZQ48Tg*~8-y4H zf$$re`Xd5B^}BQ&OM;6%v%PsEZs^*d`YyFa-6Al6Hcf`cQ}BC$_=lp+Xnqq3OMn-d z&2$X!-^tGAs1nF@1YeK&rHy2V1J42DExobG_!~QgdobQcC~-{}>n;H*ByV0000G zbW%=J0RR90|NsC0|NsC0|NsC0z)*`r0006ANkl1UGsFhuCHnLxCu@-`xiuVFy2 zdS^moSHF>?i*V!(!u&yy?4}{$DS55p2w;TY84}gy3;>02rW~=+1eDMq+CsqY@E?fn zP_Bh{LsQ)aRVaqnAJ0XE*kU*Q{B;&1>`DQ){?#vpFy2K4AmVv8-&_XlETRE8`(~34 zC-wrA!1Mkaz~@&2@83!g@4g#h5`fn)b>Q8Mvw(CkiP&34ts^hymk9`9S?&Sk{PP48 z2#fg@5R(Ie`F$3XsU)OeV<# zUZ|+}m0%s-*%|O^60ZP%V|t|0)02*9BZK(?l>mb#@m6O9p&(MSwv+?T&S(gTtV5<8 zaNDcMQvZUpA-v`P0{|hs=YJpYc%^tB{X_i#%;qYz`l)3400000NkvXXu0mjfGE+H+ diff --git a/graphics/pokemon/castform/snowy/normal.pal b/graphics/pokemon/castform/snowy/normal.pal index e05641ab1..a32ac8fa0 100644 --- a/graphics/pokemon/castform/snowy/normal.pal +++ b/graphics/pokemon/castform/snowy/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -248 160 176 197 197 148 41 82 57 123 82 189 139 115 213 -148 180 205 +222 84 195 +242 156 214 197 180 255 156 156 197 -139 205 172 -115 164 139 +172 221 198 +124 182 168 98 74 115 -189 230 230 -82 115 106 -74 82 74 +214 245 229 +83 113 116 +75 83 81 255 255 255 24 24 24 diff --git a/graphics/pokemon/castform/snowy/shiny.pal b/graphics/pokemon/castform/snowy/shiny.pal index e05641ab1..95eba6073 100644 --- a/graphics/pokemon/castform/snowy/shiny.pal +++ b/graphics/pokemon/castform/snowy/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -248 160 176 197 197 148 -41 82 57 -123 82 189 -139 115 213 -148 180 205 -197 180 255 -156 156 197 -139 205 172 -115 164 139 -98 74 115 -189 230 230 -82 115 106 +41 41 81 +88 81 189 +103 164 224 +222 84 195 +242 156 214 +246 255 178 +211 198 141 +170 201 212 +153 160 168 +74 74 115 +200 234 234 +110 120 135 74 82 74 255 255 255 24 24 24 diff --git a/graphics/pokemon/castform/sunny/anim_front.png b/graphics/pokemon/castform/sunny/anim_front.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4a9ea78813a095ff52e0a63c491d82432b3ed6 GIT binary patch literal 12547 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 E0dU;3VgLXD literal 0 HcmV?d00001 diff --git a/graphics/pokemon/castform/sunny/back.png b/graphics/pokemon/castform/sunny/back.png index a3fa23260d2af3b8de5cb91ee280ca8afdef8d65..53e5a4b60fca321be46f2ce6c66002d0087006a0 100644 GIT binary patch literal 10105 zcmeHsXH-+$)^-4CkzS-j=tXL%p$XDELa5RL2@q-^^d=x6y-8C*dQ+6%rGr#O5JY+t zkfIbRA_#BroO|y%<9q+yF~0ZT$rwA?d#z_abIxbYwMN!nG5We{#6Wr=001D?P**m< z{3={uH*hfDrfM!<0f1Y`0H~>#0n8VK@^rUHx*$Ma{wM?p;fJ&b0Q_dZK1F(dZuN<{ zvZJ=b7Qq?mrd?t3JG-RFpEMvn?Ko$=TtmGuGO|s%fr=WH#TVP@yhLYTEn6S5J|RPE zh?hKiP!P3E&oYd@YWVJyhq4;$+z;trT1w0w6JmTMyLWkMHW7F^;BoH%@ciQss?PcH z_|v${UvWPZmxuKvJx|{{tNxT-VwgHrU0e{_4SeX6d0cFMIL&$Fy|g)?Is8jJfN=f1 z{=u1yT{|7!fK1ctW74X{PRjkC$8RL%;Z_3NTgh^2%vMFddvApY_jZrYs=!6AjSBwL}ae0R!o=ZuaZr^jq^*&DTE!OSU z*&C1F?U~%NoE$KC$Ng@HsGuMY=Cn0*q3V`0rng>3HuX?HYs^pjPOtF}YPzvocW$?F z=QXKJmMvfl)8VgdOU820wT{ zubYoo__29sBhRY3$)J0-ENC{?AHr=XO6;#&l@q158%p(ZZ08G_+vLhH(%fX9m=hwZ@;KDKvSP#B>E%li`?YroFBrJ%KU$v3 z9XSSUw`5ucGDM6KuqTQg@)RXXEF4i@WFa@q>~mdbRCr!iuWH_|s@-dy&C$mIg&a@`Hbihgp!|m%rh)mM?Nr?xO)hF zIAa)ghlS~J{NYUfAuTh}NNe-gM|<&Y%;}q#Y9XSKpzqn|zH$zqTOWLBvHo=;Q>8Qh zUW&QRjHgKc+3x+o^bKHUB;mr=+V{1Ei=gGD;HxW!Uo4&Du^~dsUX+F};k05L!B*^w zWuXrUMfY$wJy0fd$BT;ZQ#KM?rp%1lsnl{M1{!JjcfCpWWww2C+h!U@O=qfB%67;j zyu|y+9R$YlE^+3s<|J%GDx5>u-8WC`?UNehhQ^LI)E5umYA5?xHEzs&r!`lt2qxxw zJ|@mBP_&I^le|B&&WbcyO_cHI=umg%o~EZwcEAY@xEViw8avc9b)oz5q^nD`GRMcR zi`-;>L^!u$tekYaTKEIF$US%Kb4yLr2VaOUY3$dDV5X7171Uk9y0qNGp52A!1nxO= zh%SDI&CbG3Rx7+Y2(O%Vtgd`0KPa76k=dtcvw>@8fai@6s&oLWYi3kk4uE`Iq83s! z2W+$7=!n7PdPr`Z@WLnAcb2^Oxxnmv)X*=&9W3bq+Pao^e25LXs8#nvWCD{(jR(1A zO8M;QykPQqLIN2Tzv}qm>wDkb+snGbXT|)v^<;610@p19_d?xL7tU;tK{W78)&yp9 zG;LX2 z+Yh0QpQENI$D5OKB>AeEis~#>{*a4lXl)B+kJc4q{^?C8g9-ZXAv`{)Pw}b9Q`( z+j1jqk*G3gaiL+{q4e^bus0_as zvzbEYL5KacKHid#ZA2VIf}Fuyp_C38NXzPKrPzEU`t>sn?&b&G=W=^({vp!)*}fSv zP^x?_5|L1?wm>M2(|GE7Za>%KnDm#{d2QhM{Va3=3JAl++l73d@CvMV?mCbA%la+i1>bW%@++K-9Z<5Vh4Lo(MPJH*53!x z$1cb}?MVh_LAjS@q~deSP_JJOkgnI?^4ZoYG6ocAspfpnHG=_j8lxA9WvFfKUq%pA z{@`gTjO2$nFYWuaBSJiAPy_|$#v|&$CSu>o7O{_Pq`C&TdgLXei20v*|8RH>kR z7H$~ltYLq_h9<75KABM>G+j4Xaeq=x2Yeo@%(S3u0MH>WpMIWpV3grtWwgAIH9nty z)9m3!?of%{eMHbgsa}a}uV2aQM+T-01s9{I^*7zp*USpOhT5_MgTf2EdL<%9O1V6Y z=!06Rmm?QXpax3Z$`bQQqS<X$ssv&5XhnDjM4AYVzlHB2n!3!xC z5XEK8cirV7%geoDf;8vNQqyv#7qxhb8e<9}HYLa!u_kq&iT;Pmf?D!NnR71wC242( zZ`JQ)o#VFBB7&_K5xSt$0^m6OzoZ>6GO7J@# zUVPW2V(Rss8W^dJk4W0qU1t6D8&b9!8W4q6-BRI4!BfUtDAE|!{S>+_b}_so-uNvv zEtEc!oF#%I{WdCA`5m+`T5VLC=LuS-Y?Zm2)xmNmS#ZA(=k;42Qwt>o=q+I`7R_1} z01ttr9D=y}=jG4`>Jx?$X zjR=s_kE1cViZFdUbKV-zYtz%iZXVTM*sqSzYEZY+Y5=fQ3mmtU9stvS0;$h|)ItRm z_}liV`zZ2439CsBFTV4B5X7p^mI83JCM;GV^kxbtC~U=`r~0;SfD0vYQAcfTb$hK- zXDy$WG0YJvugK4=^>*d$Fk6qnaF;lCyh2tfbHYSH6elHVPo(UZ)M-->?O&-Mocwbl z_P3!NtPeP*2VOK#wisU;Yg-##Fk%HlYxaAr6%NKdZiP8pgm?A5P=ExfAAV*CGGN8G zAdK&utyGay(%?zqc;!*x)Y119vINK&$hvnXH+&YKJorwq@M}wdCiQN$Y&icR#i;G_6YtvvhGCz7#FHtJzGP)}7)%Iw(Nn<>%6ZYp)Z5bgi^fQq zC4%<*yGQcH2u?qnLBYt3@!~<{@b)|^f2?sUh53*9XHc6Yt%!Ai8&%Dkome?Q=3cZ9 za2pZ$y?>5?PDyN#@hIL^C%4O$KdqZX*O-@OlUnp^^s86&aW+*w_Lt=fvxjA>VYQ+y z@p6xKXY4D~>G_r94rmMfrU^cAeQxmvf^$cdLb7r7`HiwkVhE}#ZKUe3Md1kgXoXzSh@1aJ9)e;lA z&(BA1RxYY|@1J&RC~iN@A%4K!U3ceo{N8vpbJu2r^79jE-ewK?reT-0aCuYDTbjCS z_CW+h^iwMYTgn3NO!_ zJ$6qbm&P)}^DA5Fd=#2$BqpTwJa17KD};}bCE?X5lTiS_+(H#-ik}+xwTqxu1kVgu zYgPS65NJ3J4*cu*BkIo$45J}Idp$X((1p`W{FFo@b0k2W#4?rdQ+@0!ww{<1yJHL@l~WG9~f{*efTol zh)-fH=X**SX65+A_l^NXG_;|90+aeY)#|Ax+FtWRg6br>n!y9u5*m9yg4gAIYQYYk93(aDAvSi%~ZS;01s!$e>%xs*-)ewWUYlR#HhtRPhn# zdoz7Ap|bKd z-bVbOE%}+}x)js5p#dL+np(rmSg1^ROK1*SJ~R8sT%E)&P#Nb(Ocv1SoOFAP0%Fo^t)rpXj5WCa z1b6#jBXo}Mo#zBENxu)t><0!KKYe2{qkU8A$KVH=#bnJxlNm!>+WM!WSNv^2b3GjD z;SQ!rhXs=7WDac1i-%{VpXoNfmSOLo;reYi#O|AJS|Gn8X=c9fV~!Y# znWcA+nA9Jz!X_KD=nE2GtL?t~wC442n?35w*x>j0`03l?!N`3t-OfJmlc;9ZemgR& z$8KF5lL;zD&u`&!F?joHkuxO?uKAP|Tnq_*s=i$&;*(DhYXAPCh6ZpzwV}(vkn}Bb zRY@K>hNpXvEO6L+VXaTtk0wU1I8QBp>mZZBchGBAotImcEXqXpa)Nfdr=Gn(T>5!g zRh5Jo$eN_S_8Db{NpSfl=?g*N1wPPXuKQ=7{O+u!fys`K8kwYDcf{O2=RowJUkv$t zhnZ0Ac}@GwRHq7DW;6J)p|sz*%l#YCsthLX-MrMgP^)?=^50UXam+ZZA>om_)* zKH^E0zKfC$#Hv~#k;gTbJr-;gN+p#_yPBHT(yB4`rPCTK3x1&1y651ylMKY~<7#SK z4glDO<3z8HG%mGmoqCV#Nm$4?U1R>(}ySQ^PWJ)hm*5K zTmNz}7FNzPY5Dgy^QNSfAMs~0EXl~zLt44k``ncFjM3(YP2ms$fB5I`C7gOcDn9ts zsOeODC1aW84BY}OA+zJe#2PEtSZd@})R|sOhl{dU1_z3M`x+}eSXQe#plKQ?$Hz9= zLh!`8Hoe&3ttV~VeB!=|@%`6YcwuM-Xil`=Ij*Jp$K_xN1M0MgJ%DA>x2uy?aq=RI zd|}>~0G8Tb-nGpkzqCaza5UEEGjOyGmD80U1xKWHo1_Ste^-a4X1h1=6{+z(nJg#S z{7)S813KO8beyzP4QR$C8)zgKw91x%EDg`ZJ*JiaP2g2aGB{ zFY3x3QvrVANIm7eSfIQ?q>)lr36b$vsg0tl+HT5eJwUH@Ia5aRG}|1ORBgMZSCsPY zQzRHp$4OIDj@5#a4R)ZG$+tys_^=?U-oVKaMHo!5~_XKSy+p z+EaXSh-uPE-BRC#xn9X$R`oJWhi!$Bx9KNxvC6%lHOkgXsQ7sHlWJseuvLM66Lr#} z+b))il?#=1G=T}8{utxHS~Y1tH_=Gi_*_wz3xtIhUwMC+zG!^9faM?klfkA>^eY>| zWTASs%u}jZP+r?JHYs9_uYx>@U6c*;@^Mkew}?+}zIL~%D!*r5r{q7t2DDpAn-6G> zvJu~2WAss7A4_w3cPoad&`ivrbq?2}a3JZTO(~E$IHjLi3ee(@$Wkg!pQn(gr{M3uG@);vR-ZfMWt8VJgz_8?m>W7V}Jia#_7GS-@VCakD z|J z-;k&J_9;|Z$mZ)uYbJTXqy=Z023vY^kVl3eQ;J=C48PP;C28_=Dg0t*PRR;q=6-L; zMG?Iw@7wkCVt^zjP|>L1h1!Wp=T2;)AG(qji03m7*9YQAO_qSGQFx zofVC;?bCo)yHefxh7DFV4>+e*hgt=DR~_XPCbOACBdb)*Z$wS4(UQm$?y=+9K~v|0 zUMwd@`7wWAns~NmJf)iO69B-9Kq@KeYbYuG>!ma1RdY^oiky0{0%O0mVF{Z6iI2X= zpnfiYw5CTI->vSu$lLYXHlABFVn}rZ3r5`O@P{mMM)))imP{77iu*WyQ~es_Dw-G8 z29D%w-5z%q7Xs(oaU$%~E9}QO@|`kLbo=@(LX3!BvxSmfM8iyNOP`JM+pj=6zOAh7 zSf)An=bfV?(!z%TdFrwQUcGFKphQ=5>CNC(;oDlk1IR&yA`M5#=hodrhRxJo>@gyS znIl<`EK`2(n)&`pm-0T*K5~^Q9_zuDO4Qu-;{ljpF?wRPF{3h3Q=i-st3e zYPd$G(G$;8Y}s_qJxH&j*Yr}fxJ+>48E=*=Mt=U$eYNb{WbY9$tOI-#wn#H~NsEKs zrtktbw=~eWAdPh~)|LM8VESp-F85YK;w=a^USn9?P9oPHR;EnX`^SQGsqAM+U_aY_ zi0V=rKAwBnrFc`*iM%dLD8F|@5Dp_F_8RA~)v2GawXgftGvw(hPI8K8ogC}UILzSy zEfRAGV5*}nZRhSP2!p%ZA_Vxza%_8ToopZ^T#n5| zTt`?3rG#)qst0%?3mA!2Fj{`Qed9s*c`pQP|`v| zzP`SKzM_Keo(@7H5C}v_7%T(^3t$ieXn!{^n4f?fn*EyM4-RDn+RhV+@)Z}%4pJx?U2 zDq${vjp~{Tj-dhz+uDlQ+X)LmY!PAtVqj5Q0f;1ANOY!8Qv*&$%Ikl$2rJ84yS zPgfXbIFYU}2ZRvH&Ea>)wcyf<`WkXSw(~eMgL&F9vIBl9Ep(@c3r6$g5MUH zY^0Su5il=zPpG@QiyYf^P@rqe-vthm{bN|vk!TFU|GMV?ta?L)#~)9BOad3=?=BGN zci~FI?EY|qhWQ}iza3%h{^+uEgt<8&Ff;tmlKNLW@_!jFaY=-jq=YD3Ktfy`jL}#a zB48_FDZXYquuSjd|{plMF&i#m~1d5^gA06&!1xQ{vGe@h`3ft z7%VCvEGZxYhJr<;g@vWXMcIV@OjhW6PX8-gS)u<&582;f^T$o95;QS65fGw6umeH`g$>geY}0Gyrgu^7_I8Jk6oSG~#<{=&0at;uGHh zh<`+Em1FkBbsEZwQ1yYYX)iM#3X?^4+ctWH;>@>77&Xk%^x`Uy#f(h4+}Eb7t1{|W ztlHAO`ye&VprzDqZ(wvj8*-z&ZSgoSvN`)>B##4SKs|(91dCAyyUztk_E>>Od#DT# zFF#d}Shxf$xyYWK-a4FuIuw3)vaRNqrZA_Gr0q$08#kW1^63{&@Q!5|d0oMx9$1u> zS(ITSq*%DU@W3GWylbD+&V%qxCH@UUqFnqsY-TK8w@_ZvuHe_KXz|qp+s0E*L6vDj z7b)uktj6|CQE@3&>sOG??-`*icO0;tCZ?^Gt8bm~wn8#((M~_|DZ6>dygUVwitjQX zzB5UUiq0k0Cm`<3Tr^x@5i_U)yuRdI%A^5M}jC*{qc)=Dka%D_kyt3Jh5@wfVyK)DaX$I zbAGIi`Rqdg)A4A_R%Ym=);#x@Y_wafzrxM?UP*}%QLs>1cl1=D&O(mhRoQ*ao5fIb zfR%T0r*5*+&Dtoj^~YXP4|3E(!j)afk9j|Bv%LGNNngkC`~_x20U9d0%CGL)g#QmC CYkmv> delta 540 zcmV+%0^|MpPN@Wt7=H)@0001;w}I>c001yhOjJd30070slwvU{&00$CdrJSDK>z>% z|MqI;)oTBoV%396lv+X6&E{HKQvd(|7#J9eVwV00EduL_t(oh3%Hhj)O1^MUlfSl1T9Xe>?FbkAKqG&d~0LyFwNB$ho#d zx9!oRN00u8GU^k1L;>9O$K!~Mxa}9fJwh+w9spA8N`E6z^!EXrJwWP&gn-qSW;uBQ z2m&7ffS!Fsi;e(I#a@4R0WJAg|Kd<|e*pwh0St-Sfc|DVbp-?%0d_|~lB3K7!KmJm z(*t1Uy$pP2P=D=+2_OQ*i=bwamH==53J5-+%oQA1c5iNO+1lLM~7aZ=WeAtb*ojM#!GO2B9s) zHvlq2c@KtPmSWP3HiJ3L3AL596DDAv5`qUP1nB;7L4V*3G=Mgbyv29|(cli9pwDv! zXz~C#IshT41^9qK8<9@U?*s6DRO}^z=n|*^_5TLojco#I1S%nY4loIQ7t|DB0ibMB zLl}exFfaDHknhS77W^s!uY8bCiwz(GUYxIX`sl)mcE?XyCc1lbb!Yjeo!jZ#2Snme eTWa>HeiZ>=DJOB}e0mZ90000n;;(EEX0000G zbW%=J0RR90|NsC0|NsC0|NsC0z)*`r0005bNklco3`L!2MZacCD!}C$JSzFG!B>FmYTVi`L|_eiD=>a_eD%v2AzM5DZ?GQ1wJ3HGgqjId zP}rb+DQ1}C0`2``AZzqu=3uOd*2cIQ&o~RVtqCIC2vr2LLTcEIpJf{;(2cqcI2VOB ziwn34+>Ljw$O1}k(BTc&3B*nm9!3OA+brfL;KxkJfXy&}^X-fZ+|fYkYQWQ>61b(O ztD!w7f=5a-GzI#ZN@Aek-vu#bw8*%^^S6;B$xVmOYAq4bfRAHsDJy?XXB thMx^IwD_~3w22Sg0pFp=fJ00000u}2ae00009 za7bBm000id000id0mpBsWB>pF2XskIMF-~w2LUhu3x*I!0004aNklvBYrpn$sRFDU#WY|&bz5(4cS>*}Bn5hJbx#D3sJ1W!J z5n}BPUH(sZXG?LD&Gy9@moJG1h1qPej2FaVvo?2N zJ%xk>&zQeDu%vD)gNbPy;0*dY3v(Iz4gEhGXf`zcQ zEU*K;DRG2^o1$xrjs-yTsv X;VSyPBUg4=00000NkvXXu0mjfGxgf+ diff --git a/graphics/pokemon/cherrim/sunshine/anim_front.png b/graphics/pokemon/cherrim/sunshine/anim_front.png index fe8ac9e465dbb5f168bea9e8bdf378d04e99d5d8..f9530f0e0790f8109ac065b0ab31f3d008380af7 100644 GIT binary patch literal 11320 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 z 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 delta 587 zcmV-R0<`_OSl0xQ7k@wm0{{R3SVwH_0000mP)t-sn9!hDFgTb{SopxW5D*Z+c!2n* zp!i^b_~7t(XeiLIQ25}8C~z<^pg71lXn0^KF<`|$00009a7bBm000id000id0mpBs zWB>pF2XskIMF-~w2LUhzd+g-M0005HNklI0vzDm#d9ol1(o8ewq1pW^Wv4 z7ymWfe7R7n2f0AK>~DaAuqW`jAFV%H6T1Pw?w_r7v;%eD_s^+D3$esXTL3aqKtzE@ z`2b>Iv#98vrN}6}1t6gGJ!*M#7LuKm$VmFyJ_*gHs zR&x_5B9?_{=tJGE62Qz^^{0^#Bdv8U12}}giDD0Ahkw%RMM?kwgpNs6+owe6mmi)9KzKWsEGSUW`_tlIqX$wW10!PNXz@0VBQSSCoJppyf?+h*JH2 zqUIG2whAs;A1Er&>9fqF(eJ{P2>DX!dKfSdO$#1UcUW`v6;pQC)Cp(;&3gq{vH!WO zj1YQo14IH!TXq9ZBew~*Is5=ozzH~D+W>lLe89t3m9s_M;YTR*0H>&=BXie~+->r| Z8{g>&oPN1;&ocl3002ovPDHLkV1l?$1Bn0t diff --git a/graphics/pokemon/cherrim/sunshine/front.png b/graphics/pokemon/cherrim/sunshine/front.png deleted file mode 100644 index 686ca0d1a6391b2fe54e2d8a5b8fec363c4bce88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmV-d0;v6oP)h{E0005HNkl0;Kv6jN~348(@?KCv*RhF>NK70AgUXumM_mzy)?#KhtjwSqPV8#QmgU1q5O(%RPR)n{i8p zwK0!Q_;5GtfyDxetdjvrLI6ajLmVgf1hC^oJVO+i7UTV=#KY;ZD;i3gcciObVp79# zI+sIb>j7dnnKk%WFSS;46DT5qSZc z0ECW7RNJRS=;azfqexMXDE(WNfF8uubkphHB4vy$s9ua#ppxp(^0lH0F;1j3djTW8 zexl|T4z>y|Ssy4W(CM?xq|xuflnD7!>3SG24^0amQg>K$^%YZg z*VGAU0?m5`Sh4@Ptc(zPa03ELTXq9ZBew~*Is5=ozzH~D+W>lLe89t3m9s_M;YTR* l0H>&=BXie~+->r|8{g>&oPN1;&ocl3002ovPDHLkV1h#`08an_ diff --git a/graphics/pokemon/spheal/anim_front.png b/graphics/pokemon/spheal/anim_front.png index 677d8651cd6e9402af9a78e7bfdea40b77c5bfa4..5ea0504180ee19a071b23e17dfb86b4519b17d83 100644 GIT binary patch literal 9677 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 diff --git a/graphics/pokemon/spinda/back.png b/graphics/pokemon/spinda/back.png index fb529d2d2486a9ee35f2fc7398dc47c56c55e684..4b4bc7ad3d61777e67a082d241b63bcd209de94f 100644 GIT binary patch literal 10353 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 delta 665 zcmV;K0%ra3P^ATs7=H)@0001;w}I>c001*kOjJeS;pH);QugMo=GCOdw1cdaYTk=V z-fB6tS}B}47;`}otU+4;{{a900DEFeT0t=o5D>OB#<2hZ00DGTPE!Ct=GbNc000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2j>O{4+kSNc&31$! z423(-3<5RCM4*x{Ku~bBK}Oit}D{_^+E1J(344=>Rk%{ zY|^=*%c7qX@G?1Cfki(9WchFj#-AZPQ$p<#x)pTkl`#TfaTpiz0HA7s(ccXqEa8cR z6tfg72kjo}Ab-aoi5nm;m2Lsl1b)(Y0ID540AK`I5TGZJMtcTY=?=g*K&%l_>Iz5H z>s<$E2n@0DuHM1A{*!ZR2uXessMYrw+zDBJ5+Ju}$?yXq7;XTqUS{*o-09b=a^;vs zKHNAQ^#cPXgdc7;6|CzPV=eP*lrQIzt9;w{tsFi-nSZawGU)gC>^B0i0FVu!(tR(4 zTtc!L*sE}_2%HVv0frWs0UEsx;N}^;2DtAzaGl=jfbzXjjW@bZ;{V7GR*R zX6dN~JX6dHbYTzVHLQLN}a{@26pfQ3C`}^aVAuRI6hl}K7Gzhk3e{6aa z93k|jsDF2S2%|gz&I#~7B9a(Mtn!${sgD8I{`dlLWI115gy_A9^#B*~S)cn*e=s8? zA*wM@OTn2r5s|}lH3~5)EsedH!u23(RrYrXu7~lgYC0Zyq0bkIufhn}>hFp7`h_X< zU!`YBXJajazTp9>+Fiogm@9}^`RKLvKO0|_ixMJ3YAAzi00000NkvXXu0mjfr1~l) diff --git a/graphics/pokemon/spinda/normal.pal b/graphics/pokemon/spinda/normal.pal index 9b0ad5bfc..3c347b1a3 100644 --- a/graphics/pokemon/spinda/normal.pal +++ b/graphics/pokemon/spinda/normal.pal @@ -2,17 +2,17 @@ JASC-PAL 0100 16 49 164 82 -246 230 172 -230 213 164 -197 180 131 -172 148 106 -222 139 74 +251 245 223 +231 218 192 +209 186 158 +172 131 108 +242 136 54 222 106 57 -180 90 41 -156 57 24 +179 66 41 +154 35 24 115 65 16 -172 65 90 -255 255 0 +170 65 119 +242 115 166 255 255 0 123 98 74 90 65 49 diff --git a/graphics/pokemon/spinda/shiny.pal b/graphics/pokemon/spinda/shiny.pal index 6aa748129..e44ef5181 100644 --- a/graphics/pokemon/spinda/shiny.pal +++ b/graphics/pokemon/spinda/shiny.pal @@ -2,17 +2,17 @@ JASC-PAL 0100 16 49 164 82 -246 230 172 -230 213 164 -197 180 131 -172 148 106 +251 245 223 +231 218 192 +209 186 158 +172 131 108 180 197 90 -148 164 57 -115 131 24 -82 98 0 +134 162 57 +87 129 24 +46 97 0 49 65 0 -172 65 90 -255 255 0 +170 65 119 +242 115 166 255 255 0 123 98 74 90 65 49 diff --git a/include/pokemon.h b/include/pokemon.h index 0a4e160e2..aa4f26a4c 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -543,7 +543,7 @@ u16 NationalToHoennOrder(u16 nationalNum); u16 SpeciesToNationalPokedexNum(u16 species); u16 SpeciesToHoennPokedexNum(u16 species); u16 HoennToNationalOrder(u16 hoennNum); -void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic); +void DrawSpindaSpots(u32 personality, u8 *dest, bool32 isSecondFrame); void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); u8 GetPlayerFlankId(void); u16 GetLinkTrainerFlankId(u8 id); diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index aaf9c91af..63d65079e 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -404,7 +404,7 @@ const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_fro const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front.4bpp.lz"); const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front.4bpp.lz"); const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front.4bpp.lz"); -const u32 gMonFrontPic_Castform[] = INCBIN_U32("graphics/pokemon/castform/front.4bpp.lz"); +const u32 gMonFrontPic_Castform[] = INCBIN_U32("graphics/pokemon/castform/anim_front.4bpp.lz"); const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front.4bpp.lz"); const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front.4bpp.lz"); const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front.4bpp.lz"); @@ -1148,9 +1148,9 @@ const u32 gMonFrontPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/anim_fron const u32 gMonFrontPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/anim_front.4bpp.lz"); const u32 gMonFrontPic_UnownExclamationMark[] = INCBIN_U32("graphics/pokemon/unown/exclamation_mark/anim_front.4bpp.lz"); const u32 gMonFrontPic_UnownQuestionMark[] = INCBIN_U32("graphics/pokemon/unown/question_mark/anim_front.4bpp.lz"); -const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/front.4bpp.lz"); -const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/front.4bpp.lz"); -const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/front.4bpp.lz"); +const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/anim_front.4bpp.lz"); +const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/anim_front.4bpp.lz"); +const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/anim_front.4bpp.lz"); const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/anim_front.4bpp.lz"); const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/anim_front.4bpp.lz"); const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/anim_front.4bpp.lz"); @@ -1159,7 +1159,7 @@ const u32 gMonFrontPic_BurmySandyCloak[] = INCBIN_U32("graphics/pokemon/burmy/sa const u32 gMonFrontPic_BurmyTrashCloak[] = INCBIN_U32("graphics/pokemon/burmy/trash_cloak/anim_front.4bpp.lz"); const u32 gMonFrontPic_WormadamSandyCloak[] = INCBIN_U32("graphics/pokemon/wormadam/sandy_cloak/anim_front.4bpp.lz"); const u32 gMonFrontPic_WormadamTrashCloak[] = INCBIN_U32("graphics/pokemon/wormadam/trash_cloak/anim_front.4bpp.lz"); -const u32 gMonFrontPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/front.4bpp.lz"); +const u32 gMonFrontPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/anim_front.4bpp.lz"); const u32 gMonFrontPic_ShellosEastSea[] = INCBIN_U32("graphics/pokemon/shellos/east_sea/anim_front.4bpp.lz"); const u32 gMonFrontPic_GastrodonEastSea[] = INCBIN_U32("graphics/pokemon/gastrodon/east_sea/anim_front.4bpp.lz"); const u32 gMonFrontPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/anim_front.4bpp.lz"); diff --git a/src/data/pokemon_graphics/front_pic_anims.h b/src/data/pokemon_graphics/front_pic_anims.h index d30dc4266..309e14e89 100644 --- a/src/data/pokemon_graphics/front_pic_anims.h +++ b/src/data/pokemon_graphics/front_pic_anims.h @@ -3264,6 +3264,16 @@ static const union AnimCmd sAnim_Breloom_1[] = ANIMCMD_END, }; +static const union AnimCmd sAnim_Spinda_1[] = +{ + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 13), + ANIMCMD_END, +}; + static const union AnimCmd sAnim_Wingull_1[] = { ANIMCMD_FRAME(0, 17), @@ -4153,27 +4163,45 @@ static const union AnimCmd sAnim_Aggron_1[] = ANIMCMD_END, }; -static const union AnimCmd sAnim_Castform_0[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - static const union AnimCmd sAnim_Castform_1[] = { - ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), ANIMCMD_END, }; -static const union AnimCmd sAnim_Castform_2[] = +static const union AnimCmd sAnim_CastformSunny_1[] = { - ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), ANIMCMD_END, }; -static const union AnimCmd sAnim_Castform_3[] = +static const union AnimCmd sAnim_CastformRainy_1[] = { - ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_CastformSnowy_1[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 29), + ANIMCMD_FRAME(0, 12), ANIMCMD_END, }; @@ -5134,15 +5162,12 @@ static const union AnimCmd sAnim_CherrimOvercast_2[] = static const union AnimCmd sAnim_CherrimSunshine_1[] = { - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; @@ -10821,9 +10846,7 @@ SINGLE_ANIMATION(Taillow); SINGLE_ANIMATION(Swellow); SINGLE_ANIMATION(Shroomish); SINGLE_ANIMATION(Breloom); -static const union AnimCmd *const sAnims_Spinda[] ={ - sAnim_GeneralFrame0, -}; +SINGLE_ANIMATION(Spinda); SINGLE_ANIMATION(Wingull); SINGLE_ANIMATION(Pelipper); DOUBLE_ANIMATION(Surskit); @@ -10900,12 +10923,10 @@ SINGLE_ANIMATION(Relicanth); SINGLE_ANIMATION(Aron); SINGLE_ANIMATION(Lairon); SINGLE_ANIMATION(Aggron); -static const union AnimCmd *const sAnims_Castform[] ={ - sAnim_Castform_0, - sAnim_Castform_1, - sAnim_Castform_2, - sAnim_Castform_3, -}; +SINGLE_ANIMATION(Castform); +SINGLE_ANIMATION(CastformSunny); +SINGLE_ANIMATION(CastformRainy); +SINGLE_ANIMATION(CastformSnowy); SINGLE_ANIMATION(Volbeat); SINGLE_ANIMATION(Illumise); SINGLE_ANIMATION(Lileep); @@ -12742,9 +12763,9 @@ const union AnimCmd *const *const gMonFrontAnimsPtrTable[NUM_SPECIES + 1] = [SPECIES_UNOWN_Z] = sAnims_UnownZ, [SPECIES_UNOWN_EMARK] = sAnims_UnownEMark, [SPECIES_UNOWN_QMARK] = sAnims_UnownQMark, - [SPECIES_CASTFORM_SUNNY] = sAnims_Castform, - [SPECIES_CASTFORM_RAINY] = sAnims_Castform, - [SPECIES_CASTFORM_SNOWY] = sAnims_Castform, + [SPECIES_CASTFORM_SUNNY] = sAnims_CastformSunny, + [SPECIES_CASTFORM_RAINY] = sAnims_CastformRainy, + [SPECIES_CASTFORM_SNOWY] = sAnims_CastformSnowy, [SPECIES_DEOXYS_ATTACK] = sAnims_DeoxysAttack, [SPECIES_DEOXYS_DEFENSE] = sAnims_DeoxysDefense, [SPECIES_DEOXYS_SPEED] = sAnims_DeoxysSpeed, diff --git a/src/decompress.c b/src/decompress.c index 54e7200be..b4de99efc 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -109,7 +109,11 @@ void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontP LZ77UnCompWram(gMonBackPicTable[SPECIES_NONE].data, dest); } - DrawSpindaSpots(species, personality, dest, isFrontPic); + if (species == SPECIES_SPINDA && isFrontPic) + { + DrawSpindaSpots(personality, dest, FALSE); + DrawSpindaSpots(personality, dest, TRUE); + } } void Unused_LZDecompressWramIndirect(const void **src, void *dest) diff --git a/src/pokemon.c b/src/pokemon.c index 23edee9a7..cf2c8f5cc 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2289,7 +2289,7 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_TORKOAL - 1] = ANIM_V_STRETCH, [SPECIES_SPOINK - 1] = ANIM_H_JUMPS_V_STRETCH_TWICE, [SPECIES_GRUMPIG - 1] = ANIM_H_JUMPS_V_STRETCH, - [SPECIES_SPINDA - 1] = ANIM_H_JUMPS, + [SPECIES_SPINDA - 1] = ANIM_CIRCLE_INTO_BG, [SPECIES_TRAPINCH - 1] = ANIM_V_SHAKE, [SPECIES_VIBRAVA - 1] = ANIM_H_SHAKE, [SPECIES_FLYGON - 1] = ANIM_ZIGZAG_SLOW, @@ -2314,9 +2314,6 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_FEEBAS - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, [SPECIES_MILOTIC - 1] = ANIM_CIRCULAR_STRETCH_TWICE, [SPECIES_CASTFORM - 1] = ANIM_H_SLIDE_WOBBLE, - [SPECIES_CASTFORM_SUNNY - 1] = ANIM_H_SLIDE_WOBBLE, - [SPECIES_CASTFORM_RAINY - 1] = ANIM_H_SLIDE_WOBBLE, - [SPECIES_CASTFORM_SNOWY - 1] = ANIM_H_SLIDE_WOBBLE, [SPECIES_KECLEON - 1] = ANIM_FLICKER_INCREASING, [SPECIES_SHUPPET - 1] = ANIM_V_SLIDE_WOBBLE, [SPECIES_BANETTE - 1] = ANIM_CIRCULAR_STRETCH_TWICE, @@ -2328,7 +2325,7 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_WYNAUT - 1] = ANIM_H_JUMPS_V_STRETCH, [SPECIES_SNORUNT - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, [SPECIES_GLALIE - 1] = ANIM_ZIGZAG_FAST, - [SPECIES_SPHEAL - 1] = ANIM_V_STRETCH, + [SPECIES_SPHEAL - 1] = ANIM_SPIN_LONG, [SPECIES_SEALEO - 1] = ANIM_V_STRETCH, [SPECIES_WALREIN - 1] = ANIM_H_SHAKE, [SPECIES_CLAMPERL - 1] = ANIM_TWIST, @@ -2880,16 +2877,20 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_SNEASLER - 1] = ANIM_V_SQUISH_AND_BOUNCE, [SPECIES_OVERQWIL - 1] = ANIM_V_SQUISH_AND_BOUNCE, [SPECIES_ENAMORUS - 1] = ANIM_V_SQUISH_AND_BOUNCE, - [SPECIES_DEOXYS_ATTACK - 1] = ANIM_GROW_VIBRATE, - [SPECIES_DEOXYS_DEFENSE - 1] = ANIM_GROW_VIBRATE, - [SPECIES_DEOXYS_SPEED - 1] = ANIM_GROW_VIBRATE, + //Gen 3 Forms + [SPECIES_CASTFORM_SUNNY - 1] = ANIM_GROW_VIBRATE, + [SPECIES_CASTFORM_RAINY - 1] = ANIM_SWING_CONVEX_FAST, + [SPECIES_CASTFORM_SNOWY - 1] = ANIM_V_STRETCH, + [SPECIES_DEOXYS_ATTACK - 1] = ANIM_GROW_VIBRATE, + [SPECIES_DEOXYS_DEFENSE - 1] = ANIM_GROW_VIBRATE, + [SPECIES_DEOXYS_SPEED - 1] = ANIM_GROW_VIBRATE, //Gen 4 Forms [SPECIES_BURMY_SANDY_CLOAK - 1] = ANIM_V_STRETCH, [SPECIES_BURMY_TRASH_CLOAK - 1] = ANIM_V_STRETCH, [SPECIES_WORMADAM_SANDY_CLOAK - 1] = ANIM_SWING_CONVEX_FAST_SHORT, [SPECIES_WORMADAM_TRASH_CLOAK - 1] = ANIM_SWING_CONVEX_FAST_SHORT, - [SPECIES_CHERRIM_SUNSHINE - 1] = ANIM_RAPID_H_HOPS, + [SPECIES_CHERRIM_SUNSHINE - 1] = ANIM_H_JUMPS_V_STRETCH, [SPECIES_SHELLOS_EAST_SEA - 1] = ANIM_V_STRETCH, [SPECIES_GASTRODON_EAST_SEA - 1] = ANIM_CIRCULAR_STRETCH_TWICE, [SPECIES_ROTOM_HEAT - 1] = ANIM_V_SQUISH_AND_BOUNCE, @@ -6807,7 +6808,7 @@ u16 HoennToNationalOrder(u16 hoennNum) // To draw a spot pixel, add 4 to the color index #define SPOT_COLOR_ADJUSTMENT 4 /* - The macro below handles drawing the randomly-placed spots on Spinda's front sprite. + The function below handles drawing the randomly-placed spots on Spinda's front sprite. Spinda has 4 spots, each with an entry in gSpindaSpotGraphics. Each entry contains a base x and y coordinate for the spot and a 16x16 binary image. Each bit in the image determines whether that pixel should be considered part of the spot. @@ -6819,85 +6820,80 @@ u16 HoennToNationalOrder(u16 hoennNum) coordinate is calculated as (baseCoord + (given 4 bits of personality) - 8). In effect this means each spot can start at any position -8 to +7 off of its base coordinates (256 possibilities). - The macro then loops over the 16x16 spot image. For each bit in the spot's binary image, if + The function then loops over the 16x16 spot image. For each bit in the spot's binary image, if the bit is set then it's part of the spot; try to draw it. A pixel is drawn on Spinda if the pixel on Spinda satisfies the following formula: ((u8)(colorIndex - 1) <= 2). The -1 excludes transparent pixels, as these are index 0. Therefore only colors 1, 2, or 3 on Spinda will allow a spot to be drawn. These color indexes are Spinda's light brown body colors. To create the spot it adds 4 to the color index, so Spinda's spots will be colors 5, 6, and 7. - The above is done two different ways in the macro: one with << 4, and one without. This + The above is done two different ways in the function: one with << 4, and one without. This is because Spinda's sprite is a 4 bits per pixel image, but the pointer to Spinda's pixels (destPixels) is an 8 bit pointer, so it addresses two pixels. Shifting by 4 accesses the 2nd of these pixels, so this is done every other time. */ -#define DRAW_SPINDA_SPOTS(personality, dest) \ -{ \ - s32 i; \ - for (i = 0; i < (s32)ARRAY_COUNT(gSpindaSpotGraphics); i++) \ - { \ - s32 row; \ - u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); \ - u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); \ - \ - for (row = 0; row < SPINDA_SPOT_HEIGHT; row++) \ - { \ - s32 column; \ - s32 spotPixelRow = gSpindaSpotGraphics[i].image[row]; \ - \ - for (column = x; column < x + SPINDA_SPOT_WIDTH; column++) \ - { \ - /* Get target pixels on Spinda's sprite */ \ - u8 *destPixels = dest + ((column / 8) * TILE_SIZE_4BPP) + \ - ((column % 8) / 2) + \ - ((y / 8) * TILE_SIZE_4BPP * 8) + \ - ((y % 8) * 4); \ - \ - /* Is this pixel in the 16x16 spot image part of the spot? */ \ - if (spotPixelRow & 1) \ - { \ - /* destPixels addressess two pixels, alternate which */ \ - /* of the two pixels is being considered for drawing */ \ - if (column & 1) \ - { \ - /* Draw spot pixel if this is Spinda's body color */ \ - if ((u8)((*destPixels & 0xF0) - (FIRST_SPOT_COLOR << 4))\ - <= ((LAST_SPOT_COLOR - FIRST_SPOT_COLOR) << 4))\ - *destPixels += (SPOT_COLOR_ADJUSTMENT << 4); \ - } \ - else \ - { \ - /* Draw spot pixel if this is Spinda's body color */ \ - if ((u8)((*destPixels & 0xF) - FIRST_SPOT_COLOR) \ - <= (LAST_SPOT_COLOR - FIRST_SPOT_COLOR)) \ - *destPixels += SPOT_COLOR_ADJUSTMENT; \ - } \ - } \ - \ - spotPixelRow >>= 1; \ - } \ - \ - y++; \ - } \ - \ - personality >>= 8; \ - } \ -} - -// Same as DrawSpindaSpots but attempts to discern for itself whether or -// not it's the front pic. -static void DrawSpindaSpotsUnused(u16 species, u32 personality, u8 *dest) +void DrawSpindaSpots(u32 personality, u8 *dest, bool32 isSecondFrame) { - if (species == SPECIES_SPINDA - && dest != gMonSpritesGfxPtr->sprites.ptr[B_POSITION_PLAYER_LEFT] - && dest != gMonSpritesGfxPtr->sprites.ptr[B_POSITION_PLAYER_RIGHT]) - DRAW_SPINDA_SPOTS(personality, dest); -} + s32 i; + for (i = 0; i < (s32)ARRAY_COUNT(gSpindaSpotGraphics); i++) + { + s32 row; + u8 x = gSpindaSpotGraphics[i].x + (personality & 0x0F); + u8 y = gSpindaSpotGraphics[i].y + ((personality & 0xF0) >> 4); -void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic) -{ - if (species == SPECIES_SPINDA && isFrontPic) - DRAW_SPINDA_SPOTS(personality, dest); + if (isSecondFrame) + { + x -= 12; + y += 56; + } + else + { + x -= 8; + y -= 8; + } + + for (row = 0; row < SPINDA_SPOT_HEIGHT; row++) + { + s32 column; + s32 spotPixelRow = gSpindaSpotGraphics[i].image[row]; + + for (column = x; column < x + SPINDA_SPOT_WIDTH; column++) + { + /* Get target pixels on Spinda's sprite */ + u8 *destPixels = dest + ((column / 8) * TILE_SIZE_4BPP) + + ((column % 8) / 2) + + ((y / 8) * TILE_SIZE_4BPP * 8) + + ((y % 8) * 4); + + /* Is this pixel in the 16x16 spot image part of the spot? */ + if (spotPixelRow & 1) + { + /* destPixels addressess two pixels, alternate which */ + /* of the two pixels is being considered for drawing */ + if (column & 1) + { + /* Draw spot pixel if this is Spinda's body color */ + if ((u8)((*destPixels & 0xF0) - (FIRST_SPOT_COLOR << 4)) + <= ((LAST_SPOT_COLOR - FIRST_SPOT_COLOR) << 4)) + *destPixels += (SPOT_COLOR_ADJUSTMENT << 4); + } + else + { + /* Draw spot pixel if this is Spinda's body color */ + if ((u8)((*destPixels & 0xF) - FIRST_SPOT_COLOR) + <= (LAST_SPOT_COLOR - FIRST_SPOT_COLOR)) + *destPixels += SPOT_COLOR_ADJUSTMENT; + } + } + + spotPixelRow >>= 1; + } + + y++; + } + + personality >>= 8; + } } void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) @@ -8109,13 +8105,7 @@ const u8 *GetTrainerNameFromId(u16 trainerId) bool8 HasTwoFramesAnimation(u16 species) { - return (species != SPECIES_CASTFORM - && species != SPECIES_SPINDA - && species != SPECIES_UNOWN - && species != SPECIES_CHERRIM - && species != SPECIES_CASTFORM_SUNNY - && species != SPECIES_CASTFORM_RAINY - && species != SPECIES_CASTFORM_SNOWY); + return species != SPECIES_UNOWN; } static bool8 ShouldSkipFriendshipChange(void) diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index c9f6a0489..57b3d5b30 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -575,9 +575,9 @@ static const u8 sSpeciesToBackAnimSet[NUM_SPECIES] = [SPECIES_LAIRON] = BACK_ANIM_V_SHAKE, [SPECIES_AGGRON] = BACK_ANIM_V_SHAKE_LOW, [SPECIES_CASTFORM] = BACK_ANIM_CONVEX_DOUBLE_ARC, - [SPECIES_CASTFORM_SUNNY] = BACK_ANIM_CONVEX_DOUBLE_ARC, - [SPECIES_CASTFORM_RAINY] = BACK_ANIM_CONVEX_DOUBLE_ARC, - [SPECIES_CASTFORM_SNOWY] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_CASTFORM_SUNNY] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_CASTFORM_RAINY] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_CASTFORM_SNOWY] = BACK_ANIM_TRIANGLE_DOWN, [SPECIES_VOLBEAT] = BACK_ANIM_CONVEX_DOUBLE_ARC, [SPECIES_ILLUMISE] = BACK_ANIM_CONVEX_DOUBLE_ARC, [SPECIES_LILEEP] = BACK_ANIM_H_STRETCH, @@ -722,7 +722,7 @@ static const u8 sSpeciesToBackAnimSet[NUM_SPECIES] = [SPECIES_BURMY_TRASH_CLOAK] = BACK_ANIM_H_SHAKE, [SPECIES_WORMADAM_SANDY_CLOAK] = BACK_ANIM_V_SHAKE, [SPECIES_WORMADAM_TRASH_CLOAK] = BACK_ANIM_V_SHAKE, - [SPECIES_CHERRIM_SUNSHINE] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_CHERRIM_SUNSHINE] = BACK_ANIM_CONCAVE_ARC_SMALL, [SPECIES_SHELLOS_EAST_SEA] = BACK_ANIM_H_SPRING, [SPECIES_GASTRODON_EAST_SEA] = BACK_ANIM_SHRINK_GROW_VIBRATE, [SPECIES_ROTOM_HEAT] = BACK_ANIM_SHAKE_GLOW_RED, From e9bd8979b03cc5f71fff21d9bcdcdf4f6786add1 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Wed, 12 Jul 2023 20:07:39 +0100 Subject: [PATCH 037/111] More efficient Random calls in Shuffle --- src/random.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/random.c b/src/random.c index 345d585c2..dded1ec6f 100644 --- a/src/random.c +++ b/src/random.c @@ -1,5 +1,8 @@ #include "global.h" #include "random.h" +#if MODERN +#include +#endif EWRAM_DATA static u8 sUnknown = 0; EWRAM_DATA static u32 sRandCount = 0; @@ -37,7 +40,7 @@ u16 Random2(void) --n; \ while (n > 1) \ { \ - int j = Random() % (n+1); \ + int j = (Random() * (n+1)) >> 16; \ SWAP(data[n], data[j], tmp); \ --n; \ } @@ -66,7 +69,7 @@ void ShuffleN(void *data, size_t n, size_t size) --n; while (n > 1) { - int j = Random() % (n+1); + int j = (Random() * (n+1)) >> 16; memcpy(tmp, (u8 *)data + n*size, size); // tmp = data[n]; memcpy((u8 *)data + n*size, (u8 *)data + j*size, size); // data[n] = data[j]; memcpy((u8 *)data + j*size, tmp, size); // data[j] = tmp; From b31f10d124709c29e2f40238a0756bc83b384896 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 14 Jul 2023 18:10:42 +0100 Subject: [PATCH 038/111] Make Hydra respect -jN (#3132) --- test/test_battle.h | 2 +- tools/mgba-rom-test-hydra/main.c | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/test/test_battle.h b/test/test_battle.h index 607589eea..039506c1b 100644 --- a/test/test_battle.h +++ b/test/test_battle.h @@ -1,7 +1,7 @@ /* Embedded DSL for automated black-box testing of battle mechanics. * * To run all the tests use: - * make check + * make check -j * To run specific tests, e.g. Spikes ones, use: * make check TESTS='Spikes' * To build a ROM (pokemerald-test.elf) that can be opened in mgba to diff --git a/tools/mgba-rom-test-hydra/main.c b/tools/mgba-rom-test-hydra/main.c index 7151255de..123d8a255 100644 --- a/tools/mgba-rom-test-hydra/main.c +++ b/tools/mgba-rom-test-hydra/main.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,8 @@ #define MAX_FAILED_TESTS_TO_LIST 100 #define MAX_TEST_LIST_BUFFER_LENGTH 256 +#define ARRAY_COUNT(arr) (sizeof((arr)) / sizeof((arr)[0])) + struct Runner { pid_t pid; @@ -248,7 +251,29 @@ int main(int argc, char *argv[]) exit(2); } - nrunners = sysconf(_SC_NPROCESSORS_ONLN); + nrunners = 1; + const char *makeflags = getenv("MAKEFLAGS"); + if (makeflags) + { + int e; + regex_t preg; + regmatch_t pmatch[4]; + if ((e = regcomp(&preg, "(^| )-j([0-9]*)($| )", REG_EXTENDED)) != 0) + { + char errbuf[256]; + regerror(e, &preg, errbuf, sizeof(errbuf)); + fprintf(stderr, "regcomp failed: '%s'\n", errbuf); + exit(2); + } + if (regexec(&preg, makeflags, ARRAY_COUNT(pmatch), pmatch, 0) != REG_NOMATCH) + { + if (pmatch[2].rm_so == pmatch[2].rm_eo) + nrunners = sysconf(_SC_NPROCESSORS_ONLN); + else + sscanf(makeflags + pmatch[2].rm_so, "%d", &nrunners); + } + regfree(&preg); + } if (nrunners > MAX_PROCESSES) nrunners = MAX_PROCESSES; runners_digits = ceil(log10(nrunners)); From 4637d7e7eeb4a2b3c4e2231434317fe81691cdaa Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 14 Jul 2023 09:50:55 +0100 Subject: [PATCH 039/111] Recover from test crashes --- ld_script_test.txt | 7 +++ test/test.h | 3 +- test/test_runner.c | 131 +++++++++++++++++++++++++++++++++------------ 3 files changed, 104 insertions(+), 37 deletions(-) diff --git a/ld_script_test.txt b/ld_script_test.txt index 3fcac51d4..f7a74e086 100644 --- a/ld_script_test.txt +++ b/ld_script_test.txt @@ -45,6 +45,13 @@ SECTIONS { test/*.o(COMMON); *libc.a:sbrkr.o(COMMON); end = .; + + /* .persistent starts at 0x3007F00 */ + /* WARNING: This is the end of the IRQ stack, if there's too + * much data it WILL be overwritten. */ + . = 0x7F00; + test/*.o(.persistent); + . = 0x8000; } diff --git a/test/test.h b/test/test.h index 3949bdb49..24abca60d 100644 --- a/test/test.h +++ b/test/test.h @@ -13,6 +13,7 @@ enum TestResult TEST_RESULT_INVALID, TEST_RESULT_ERROR, TEST_RESULT_TIMEOUT, + TEST_RESULT_CRASH, TEST_RESULT_TODO, }; @@ -38,8 +39,6 @@ struct TestRunnerState { u8 state; u8 exitCode; - s32 tests; - s32 passes; const char *skipFilename; const struct Test *test; u32 processCosts[MAX_PROCESSES]; diff --git a/test/test_runner.c b/test/test_runner.c index 450dc77a6..5543fab04 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -15,6 +15,16 @@ void CB2_TestRunner(void); EWRAM_DATA struct TestRunnerState gTestRunnerState; EWRAM_DATA struct FunctionTestRunnerState *gFunctionTestRunnerState; +enum { + CURRENT_TEST_STATE_ESTIMATE, + CURRENT_TEST_STATE_RUN, +}; + +__attribute__((section(".persistent"))) static struct { + u32 address:28; + u32 state:1; +} sCurrentTest = {0}; + void TestRunner_Battle(const struct Test *); static bool32 MgbaOpen_(void); @@ -51,6 +61,47 @@ enum STATE_EXIT, }; +static u32 MinCostProcess(void) +{ + u32 i; + u32 minCost, minCostProcess; + + minCost = gTestRunnerState.processCosts[0]; + minCostProcess = 0; + for (i = 1; i < gTestRunnerN; i++) + { + if (gTestRunnerState.processCosts[i] < minCost) + { + minCost = gTestRunnerState.processCosts[i]; + minCostProcess = i; + } + } + + return minCostProcess; +} + +// Greedily assign tests to processes based on estimated cost. +// TODO: Make processCosts a min heap. +static u32 AssignCostToRunner(void) +{ + u32 minCostProcess; + + if (gTestRunnerState.test->runner == &gAssumptionsRunner) + return TRUE; + + minCostProcess = MinCostProcess(); + + // XXX: If estimateCost returns only on some processes, or + // returns inconsistent results then processCosts will be + // inconsistent and some tests may not run. + if (gTestRunnerState.test->runner->estimateCost) + gTestRunnerState.processCosts[minCostProcess] += gTestRunnerState.test->runner->estimateCost(gTestRunnerState.test->data); + else + gTestRunnerState.processCosts[minCostProcess] += 1; + + return minCostProcess; +} + void CB2_TestRunner(void) { switch (gTestRunnerState.state) @@ -65,12 +116,43 @@ void CB2_TestRunner(void) gIntrTable[7] = Intr_Timer2; - gTestRunnerState.state = STATE_NEXT_TEST; + // The current test restarted the ROM (e.g. by jumping to NULL). + if (sCurrentTest.address != 0) + { + gTestRunnerState.test = __start_tests; + while ((uintptr_t)gTestRunnerState.test != sCurrentTest.address) + { + AssignCostToRunner(); + gTestRunnerState.test++; + } + if (sCurrentTest.state == CURRENT_TEST_STATE_ESTIMATE) + { + u32 runner = MinCostProcess(); + gTestRunnerState.processCosts[runner] += 1; + if (runner == gTestRunnerI) + { + gTestRunnerState.state = STATE_REPORT_RESULT; + gTestRunnerState.result = TEST_RESULT_CRASH; + } + else + { + gTestRunnerState.state = STATE_NEXT_TEST; + } + } + else + { + gTestRunnerState.state = STATE_REPORT_RESULT; + gTestRunnerState.result = TEST_RESULT_CRASH; + } + } + else + { + gTestRunnerState.state = STATE_NEXT_TEST; + gTestRunnerState.test = __start_tests - 1; + } gTestRunnerState.exitCode = 0; - gTestRunnerState.tests = 0; - gTestRunnerState.passes = 0; gTestRunnerState.skipFilename = NULL; - gTestRunnerState.test = __start_tests - 1; + break; case STATE_NEXT_TEST: @@ -108,40 +190,19 @@ void CB2_TestRunner(void) return; } - // Greedily assign tests to processes based on estimated cost. - // TODO: Make processCosts a min heap. - if (gTestRunnerState.test->runner != &gAssumptionsRunner) - { - u32 i; - u32 minCost, minCostProcess; - minCost = gTestRunnerState.processCosts[0]; - minCostProcess = 0; - for (i = 1; i < gTestRunnerN; i++) - { - if (gTestRunnerState.processCosts[i] < minCost) - { - minCost = gTestRunnerState.processCosts[i]; - minCostProcess = i; - } - } + sCurrentTest.address = (uintptr_t)gTestRunnerState.test; + sCurrentTest.state = CURRENT_TEST_STATE_ESTIMATE; - if (minCostProcess == gTestRunnerI) - gTestRunnerState.state = STATE_RUN_TEST; - else - gTestRunnerState.state = STATE_NEXT_TEST; - - // XXX: If estimateCost exits only on some processes then - // processCosts will be inconsistent. - if (gTestRunnerState.test->runner->estimateCost) - gTestRunnerState.processCosts[minCostProcess] += gTestRunnerState.test->runner->estimateCost(gTestRunnerState.test->data); - else - gTestRunnerState.processCosts[minCostProcess] += 1; - } + if (AssignCostToRunner() == gTestRunnerI) + gTestRunnerState.state = STATE_RUN_TEST; + else + gTestRunnerState.state = STATE_NEXT_TEST; break; case STATE_RUN_TEST: gTestRunnerState.state = STATE_REPORT_RESULT; + sCurrentTest.state = CURRENT_TEST_STATE_RUN; if (gTestRunnerState.test->runner->setUp) gTestRunnerState.test->runner->setUp(gTestRunnerState.test->data); gTestRunnerState.test->runner->run(gTestRunnerState.test->data); @@ -186,11 +247,8 @@ void CB2_TestRunner(void) const char *color; const char *result; - gTestRunnerState.tests++; - if (gTestRunnerState.result == gTestRunnerState.expectedResult) { - gTestRunnerState.passes++; color = "\e[32m"; MgbaPrintf_(":N%s", gTestRunnerState.test->name); } @@ -243,6 +301,9 @@ void CB2_TestRunner(void) case TEST_RESULT_TIMEOUT: result = "TIMEOUT"; break; + case TEST_RESULT_CRASH: + result = "CRASH"; + break; default: result = "UNKNOWN"; break; From 25986be0893f8b60b39e277b740f94e1cf4a7110 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 14 Jul 2023 13:27:50 +0100 Subject: [PATCH 040/111] Prevent corrupted heaps causing infinite loops --- test/test_runner.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/test_runner.c b/test/test_runner.c index 5543fab04..d91ad02d1 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -223,6 +223,15 @@ void CB2_TestRunner(void) const struct MemBlock *block = head; do { + if (block->magic != MALLOC_SYSTEM_ID + || !(EWRAM_START <= (uintptr_t)block->next && (uintptr_t)block->next < EWRAM_END) + || (block->next <= block && block->next != head)) + { + MgbaPrintf_("gHeap corrupted block at 0x%p", block); + gTestRunnerState.result = TEST_RESULT_ERROR; + break; + } + if (block->allocated) { const char *location = MemBlockLocation(block); @@ -495,6 +504,7 @@ static s32 MgbaVPrintf_(const char *fmt, va_list va) { s32 i = 0; s32 c, d; + u32 p; const char *s; while (*fmt) { @@ -528,6 +538,20 @@ static s32 MgbaVPrintf_(const char *fmt, va_list va) i = MgbaPutchar_(i, buffer[--n]); } break; + case 'p': + p = va_arg(va, unsigned); + { + s32 n; + for (n = 0; n < 7; n++) + { + unsigned nybble = (p >> (24 - (4*n))) & 0xF; + if (nybble <= 9) + i = MgbaPutchar_(i, '0' + nybble); + else + i = MgbaPutchar_(i, 'a' + nybble - 10); + } + } + break; case 'q': d = va_arg(va, int); { From 2a249654e7ea32bc6ab1285d3e44eb8d534e25b7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 15 Jul 2023 14:00:55 +0200 Subject: [PATCH 041/111] fix mirror move/metronome powder/multi hit moves & tests --- include/battle.h | 1 + include/battle_util.h | 1 + src/battle_message.c | 2 +- src/battle_script_commands.c | 33 +++++++------- src/battle_util.c | 12 +++-- test/ability_magic_bounce.c | 1 - test/move_effect_metronome.c | 69 +++++++++++++++++++++++++++++ test/move_effect_mirror_move.c | 81 ++++++++++++++++++++++++++++++++++ 8 files changed, 180 insertions(+), 20 deletions(-) create mode 100644 test/move_effect_metronome.c create mode 100644 test/move_effect_mirror_move.c diff --git a/include/battle.h b/include/battle.h index 9cf4f100a..0219ebd72 100644 --- a/include/battle.h +++ b/include/battle.h @@ -594,6 +594,7 @@ struct BattleStruct u8 wishPerishSongBattlerId; bool8 overworldWeatherDone; bool8 terrainDone; + u8 isAtkCancelerForCalledMove; // Certain cases in atk canceler should only be checked once, when the original move is called, however others need to be checked the twice. u8 atkCancellerTracker; struct BattleTvMovePoints tvMovePoints; struct BattleTv tv; diff --git a/include/battle_util.h b/include/battle_util.h index b5ba5249e..684aa2b51 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -136,6 +136,7 @@ u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); +void SetAtkCancellerForCalledMove(void); u8 AtkCanceller_UnableToUseMove(void); u8 AtkCanceller_UnableToUseMove2(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); diff --git a/src/battle_message.c b/src/battle_message.c index 3edb02f60..d2ca9dfd7 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -350,7 +350,7 @@ static const u8 sText_DontLeaveBirch[] = _("PROF. BIRCH: Don't leave me like thi static const u8 sText_ButNothingHappened[] = _("But nothing happened!"); static const u8 sText_ButItFailed[] = _("But it failed!"); static const u8 sText_ItHurtConfusion[] = _("It hurt itself in its\nconfusion!"); -static const u8 sText_MirrorMoveFailed[] = _("The MIRROR MOVE failed!"); +static const u8 sText_MirrorMoveFailed[] = _("The Mirror Move failed!"); static const u8 sText_StartedToRain[] = _("It started to rain!"); static const u8 sText_DownpourStarted[] = _("A downpour started!"); // corresponds to DownpourText in pokegold and pokecrystal and is used by Rain Dance in GSC static const u8 sText_RainContinues[] = _("Rain continues to fall."); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d4975fd7b..b77f92964 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1614,7 +1614,8 @@ static void Cmd_attackcanceler(void) PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT); gProtectStructs[gBattlerTarget].usesBouncedMove = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleStruct->atkCancellerTracker = CANCELLER_POWDER_MOVE; // Edge case for bouncing a powder move against a grass type pokemon. + // Edge case for bouncing a powder move against a grass type pokemon. + SetAtkCancellerForCalledMove(); if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker, TRUE)) { // Opponent used a prankster'd magic coat -> reflected status move should fail against a dark-type attacker @@ -1634,7 +1635,8 @@ static void Cmd_attackcanceler(void) { gProtectStructs[gBattlerTarget].usesBouncedMove = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleStruct->atkCancellerTracker = CANCELLER_POWDER_MOVE; // Edge case for bouncing a powder move against a grass type pokemon. + // Edge case for bouncing a powder move against a grass type pokemon. + SetAtkCancellerForCalledMove(); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; gBattlerAbility = gBattlerTarget; @@ -6342,6 +6344,7 @@ static void Cmd_moveend(void) gBattleStruct->zmove.toBeUsed[gBattlerAttacker] = MOVE_NONE; gBattleStruct->zmove.effect = EFFECT_HIT; gBattleStruct->hitSwitchTargetFailed = FALSE; + gBattleStruct->isAtkCancelerForCalledMove = FALSE; gBattleScripting.moveendState++; break; case MOVEEND_COUNT: @@ -11408,12 +11411,20 @@ static void Cmd_tryhealhalfhealth(void) gBattlescriptCurrInstr = cmd->nextInstr; } +static void SetMoveForMirrorMove(u32 move) +{ + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + gCurrentMove = move; + SetAtkCancellerForCalledMove(); + gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; +} + static void Cmd_trymirrormove(void) { CMD_ARGS(); - s32 validMovesCount; - s32 i; + s32 i, validMovesCount; u16 move; u16 validMoves[MAX_BATTLERS_COUNT] = {0}; @@ -11422,7 +11433,6 @@ static void Cmd_trymirrormove(void) if (i != gBattlerAttacker) { move = gBattleStruct->lastTakenMoveFrom[gBattlerAttacker][i]; - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) { validMoves[validMovesCount] = move; @@ -11432,21 +11442,13 @@ static void Cmd_trymirrormove(void) } move = gBattleStruct->lastTakenMove[gBattlerAttacker]; - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) { - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gCurrentMove = move; - gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; + SetMoveForMirrorMove(move); } else if (validMovesCount != 0) { - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - i = Random() % validMovesCount; - gCurrentMove = validMoves[i]; - gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; + SetMoveForMirrorMove(validMoves[Random() % validMovesCount]); } else // no valid moves found { @@ -13003,6 +13005,7 @@ static void Cmd_metronome(void) if (!(sForbiddenMoves[gCurrentMove] & FORBIDDEN_METRONOME)) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + SetAtkCancellerForCalledMove(); gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); return; diff --git a/src/battle_util.c b/src/battle_util.c index e608b0e51..f13e89bff 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3383,6 +3383,12 @@ void TryClearRageAndFuryCutter(void) } } +void SetAtkCancellerForCalledMove(void) +{ + gBattleStruct->atkCancellerTracker = CANCELLER_HEAL_BLOCKED; + gBattleStruct->isAtkCancelerForCalledMove = TRUE; +} + u8 AtkCanceller_UnableToUseMove(void) { u8 effect = 0; @@ -3565,7 +3571,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleStruct->atkCancellerTracker++; break; case CANCELLER_CONFUSED: // confusion - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) + if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { if (!(gStatuses4[gBattlerAttacker] & STATUS4_INFINITE_CONFUSION)) gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); @@ -3601,7 +3607,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleStruct->atkCancellerTracker++; break; case CANCELLER_PARALYSED: // paralysis - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && !RandomPercentage(RNG_PARALYSIS, 75)) + if (!gBattleStruct->isAtkCancelerForCalledMove && (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && !RandomPercentage(RNG_PARALYSIS, 75)) { gProtectStructs[gBattlerAttacker].prlzImmobility = TRUE; // This is removed in FRLG and Emerald for some reason @@ -3613,7 +3619,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleStruct->atkCancellerTracker++; break; case CANCELLER_IN_LOVE: // infatuation - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) + if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) { gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); if (!RandomPercentage(RNG_INFATUATION, 50)) diff --git a/test/ability_magic_bounce.c b/test/ability_magic_bounce.c index eaf925975..ab51369ef 100644 --- a/test/ability_magic_bounce.c +++ b/test/ability_magic_bounce.c @@ -56,7 +56,6 @@ SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass T } } - DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting both foes at two foes") { GIVEN { diff --git a/test/move_effect_metronome.c b/test/move_effect_metronome.c new file mode 100644 index 000000000..11a906f94 --- /dev/null +++ b/test/move_effect_metronome.c @@ -0,0 +1,69 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_METRONOME].effect == EFFECT_METRONOME); +} + +// To do: Turn the seeds to work with WITH_RNG for Metronome. +#define RNG_METRONOME_SCRATCH 0x118 +#define RNG_METRONOME_PSN_POWDER 0x119 +#define RNG_METRONOME_ROCK_BLAST 0x1F5 + +SINGLE_BATTLE_TEST("Metronome picks a random move") +{ + GIVEN { + RNGSeed(RNG_METRONOME_SCRATCH); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_METRONOME); } + } SCENE { + MESSAGE("Wobbuffet used Metronome!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, player); + MESSAGE("Wobbuffet used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_POISON_POWDER].flags & FLAG_POWDER); + ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); + ASSUME(gBattleMoves[MOVE_POISON_POWDER].effect == EFFECT_POISON); + RNGSeed(RNG_METRONOME_PSN_POWDER); + PLAYER(SPECIES_WOBBUFFET) {Speed(5);} + OPPONENT(SPECIES_TANGELA) {Speed(2);} + } WHEN { + TURN { MOVE(player, MOVE_METRONOME); } + } SCENE { + MESSAGE("Wobbuffet used Metronome!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, player); + MESSAGE("Wobbuffet used PoisonPowder!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POISON_POWDER, player); + MESSAGE("It doesn't affect Foe Tangela…"); + NOT STATUS_ICON(opponent, poison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Metronome's called multi-hit move hits multiple times") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_ROCK_BLAST].effect == EFFECT_MULTI_HIT); + RNGSeed(RNG_METRONOME_ROCK_BLAST); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_METRONOME); } + } SCENE { + MESSAGE("Wobbuffet used Metronome!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, player); + MESSAGE("Wobbuffet used Rock Blast!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_BLAST, player); + HP_BAR(opponent); + MESSAGE("Hit 4 time(s)!"); + } +} diff --git a/test/move_effect_mirror_move.c b/test/move_effect_mirror_move.c new file mode 100644 index 000000000..2b8b9dbe9 --- /dev/null +++ b/test/move_effect_mirror_move.c @@ -0,0 +1,81 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_MIRROR_MOVE].effect == EFFECT_MIRROR_MOVE); +} + +SINGLE_BATTLE_TEST("Mirror Move copies the last used move by the target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {Speed(2);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(5);} + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_MIRROR_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + HP_BAR(player); + MESSAGE("Wobbuffet used Mirror Move!"); + MESSAGE("Wobbuffet used Tackle!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {Speed(5);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(2);} + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_MIRROR_MOVE); } + } SCENE { + MESSAGE("Wobbuffet used Mirror Move!"); + MESSAGE("The Mirror Move failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_STUN_SPORE].flags & FLAG_POWDER); + ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(gBattleMoves[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE); + PLAYER(SPECIES_ODDISH) {Speed(5);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(2);} + } WHEN { + TURN { MOVE(player, MOVE_STUN_SPORE); MOVE(opponent, MOVE_MIRROR_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); + STATUS_ICON(opponent, paralysis: TRUE); + MESSAGE("Foe Wobbuffet used Mirror Move!"); + MESSAGE("Foe Wobbuffet used Stun Spore!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, opponent); + MESSAGE("It doesn't affect Oddish…"); + NOT STATUS_ICON(player, paralysis: TRUE); + } +} + +// It hits first 2 times, then 5 times with the default rng seed. +SINGLE_BATTLE_TEST("Mirror Move's called multi-hit move hits multiple times") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); + PLAYER(SPECIES_WOBBUFFET) {Speed(5);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(2);} + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); MOVE(opponent, MOVE_MIRROR_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + HP_BAR(opponent); + MESSAGE("Hit 2 time(s)!"); + MESSAGE("Foe Wobbuffet used Mirror Move!"); + MESSAGE("Foe Wobbuffet used Bullet Seed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + HP_BAR(player); + MESSAGE("Hit 5 time(s)!"); + } +} From b48175edd2c04009c57e6adac1772427867154d7 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sat, 15 Jul 2023 11:25:23 -0400 Subject: [PATCH 042/111] Updated branches that use CI --- .github/workflows/build.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a2b93f23b..02d7e22b6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,9 +4,7 @@ on: push: branches: - master - - battle_engine - - pokemon_expansion - - item_expansion + - upcoming pull_request: jobs: From 381aa585870a6a5471f087b8cd2b84c7d8011133 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Jul 2023 07:38:00 +0200 Subject: [PATCH 043/111] Fix Bad Dreams ability pop-up + tests (#3131) * Fix all bad dreams issues and add tests Co-authored-by: ShaeTsuPog --- data/battle_scripts_1.s | 29 +++++---- test/ability_bad_dreams.c | 130 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 11 deletions(-) create mode 100644 test/ability_bad_dreams.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6161648ce..28a4a33cd 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8957,16 +8957,7 @@ BattleScript_PsychicSurgeActivates:: call BattleScript_ActivateTerrainEffects end3 -BattleScript_HurtTarget_NoString: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - tryfaintmon BS_TARGET - return - BattleScript_BadDreamsActivates:: - call BattleScript_AbilityPopUp - setbyte sFIXED_ABILITY_POPUP, TRUE setbyte gBattlerTarget, 0 BattleScript_BadDreamsLoop: jumpiftargetally BattleScript_BadDreamsIncrement @@ -8975,16 +8966,32 @@ BattleScript_BadDreamsLoop: jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_BadDreams_Dmg goto BattleScript_BadDreamsIncrement BattleScript_BadDreams_Dmg: + jumpifbyteequal sFIXED_ABILITY_POPUP, sZero, BattleScript_BadDreams_ShowPopUp +BattleScript_BadDreams_DmgAfterPopUp: printstring STRINGID_BADDREAMSDMG waitmessage B_WAIT_TIME_LONG dmg_1_8_targethp - call BattleScript_HurtTarget_NoString + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + jumpifhasnohp BS_TARGET, BattleScript_BadDreams_HidePopUp BattleScript_BadDreamsIncrement: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_BadDreamsLoop -BattleScript_BadDreamsEnd: + jumpifbyteequal sFIXED_ABILITY_POPUP, sZero, BattleScript_BadDreamsEnd destroyabilitypopup + pause 15 +BattleScript_BadDreamsEnd: end3 +BattleScript_BadDreams_ShowPopUp: + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + setbyte sFIXED_ABILITY_POPUP, TRUE + goto BattleScript_BadDreams_DmgAfterPopUp +BattleScript_BadDreams_HidePopUp: + destroyabilitypopup + tryfaintmon BS_TARGET + goto BattleScript_BadDreamsIncrement BattleScript_TookAttack:: attackstring diff --git a/test/ability_bad_dreams.c b/test/ability_bad_dreams.c new file mode 100644 index 000000000..9bf800534 --- /dev/null +++ b/test/ability_bad_dreams.c @@ -0,0 +1,130 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(P_GEN_4_POKEMON == TRUE); // Because only Darkrai can have this ability. +} + +// Also checks that non-sleeping enemy is not affected. +SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of hp") +{ + u32 status; + PARAMETRIZE { status = STATUS1_NONE; } + PARAMETRIZE { status = STATUS1_SLEEP; } + GIVEN { + PLAYER(SPECIES_DARKRAI); + OPPONENT(SPECIES_WOBBUFFET) {Status1(status);} + } WHEN { + TURN {;} + } SCENE { + if (status == STATUS1_SLEEP) { + ABILITY_POPUP(player, ABILITY_BAD_DREAMS); + MESSAGE("Foe Wobbuffet is tormented!"); + HP_BAR(opponent); + } + else { + NONE_OF { + ABILITY_POPUP(player, ABILITY_BAD_DREAMS); + MESSAGE("Foe Wobbuffet is tormented!"); + HP_BAR(opponent); + }; + } + } THEN { + if (status == STATUS1_SLEEP) { + EXPECT_EQ(opponent->hp, opponent->maxHP - opponent->maxHP / 8); + } + else { + EXPECT_EQ(opponent->hp, opponent->maxHP); + } + } +} + +DOUBLE_BATTLE_TEST("Bad Dreams does not activate if only the partner Pokemon is sleeping") +{ + GIVEN { + PLAYER(SPECIES_DARKRAI); + PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {;} + } SCENE { + NONE_OF { + ABILITY_POPUP(playerLeft, ABILITY_BAD_DREAMS); + MESSAGE("Wobbuffet is tormented!"); + HP_BAR(playerRight); + }; + } THEN { + EXPECT_EQ(opponentLeft->hp, opponentLeft->maxHP); + EXPECT_EQ(opponentRight->hp, opponentRight->maxHP); + EXPECT_EQ(playerRight->hp, playerRight->maxHP); + } +} + +DOUBLE_BATTLE_TEST("Bad Dreams activates for both sleeping pokemon on the player side") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + OPPONENT(SPECIES_DARKRAI); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {;} + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_BAD_DREAMS); + MESSAGE("Wobbuffet is tormented!"); + HP_BAR(playerLeft); + MESSAGE("Wobbuffet is tormented!"); + HP_BAR(playerRight); + } THEN { + EXPECT_EQ(opponentLeft->hp, opponentLeft->maxHP); + EXPECT_EQ(opponentRight->hp, opponentRight->maxHP); + EXPECT_EQ(playerLeft->hp, playerLeft->maxHP - playerLeft->maxHP / 8); + EXPECT_EQ(playerRight->hp, playerRight->maxHP - playerRight->maxHP / 8); + } +} + +DOUBLE_BATTLE_TEST("Bad Dreams faints both sleeping Pokemon on player side") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} + PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} + PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + OPPONENT(SPECIES_DARKRAI); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {SEND_OUT(playerLeft, 2); SEND_OUT(playerRight, 3);} + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_BAD_DREAMS); + MESSAGE("Wobbuffet is tormented!"); + HP_BAR(playerLeft); + MESSAGE("Wobbuffet fainted!"); + MESSAGE("Wobbuffet is tormented!"); + HP_BAR(playerRight); + MESSAGE("Wobbuffet fainted!"); + } +} + +DOUBLE_BATTLE_TEST("Bad Dreams faints both sleeping Pokemon on opponent side") +{ + GIVEN { + PLAYER(SPECIES_DARKRAI); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} + OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} + OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + } WHEN { + TURN {SEND_OUT(opponentLeft, 2); SEND_OUT(opponentRight, 3);} + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_BAD_DREAMS); + MESSAGE("Foe Wobbuffet is tormented!"); + HP_BAR(opponentLeft); + MESSAGE("Foe Wobbuffet fainted!"); + MESSAGE("Foe Wobbuffet is tormented!"); + HP_BAR(opponentRight); + MESSAGE("Foe Wobbuffet fainted!"); + } +} From 3c5c68ac582ae668e65c5626746dfe5a3e2c76b9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Jul 2023 08:24:59 +0200 Subject: [PATCH 044/111] Fix how AI categorizes Weak moves and give priority to always hits moves when needed (#3109) * ai weak move fix and always hits move prioritarizing --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 21 +++++++++++++++++++++ src/battle_ai_util.c | 8 ++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 67ff6968e..284022092 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -85,6 +85,7 @@ bool32 ShouldLowerEvasion(u8 battlerAtk, u8 battlerDef, u16 defAbility); bool32 IsAffectedByPowder(u8 battler, u16 ability, u16 holdEffect); bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split); s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *effectiveness, bool32 considerZPower); +u32 GetNoOfHitsToKO(u32 dmg, s32 hp); u8 GetMoveDamageResult(u16 move); u32 GetCurrDamageHpPercent(u8 battlerAtk, u8 battlerDef); u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 97ae1f35c..c40d8a649 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3102,6 +3102,19 @@ static bool32 IsPinchBerryItemEffect(u16 holdEffect) return FALSE; } +static u32 GetAIMostDamagingMoveId(u8 battlerAtk, u8 battlerDef) +{ + u32 i, id = 0; + u32 mostDmg = 0; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (AI_DATA->simulatedDmg[battlerAtk][battlerDef][i] > mostDmg) + id = i, mostDmg = AI_DATA->simulatedDmg[battlerAtk][battlerDef][i]; + } + return id; +} + // AI_FLAG_CHECK_VIABILITY - a weird mix of increasing and decreasing scores static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) { @@ -3122,6 +3135,14 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) // check always hits if (!IS_MOVE_STATUS(move) && gBattleMoves[move].accuracy == 0) { + // If 2 moves can KO the target in the same number of turns, but one of them always hits and there is a risk the other move could miss, prioritize the always hits move. + if (gBattleMons[battlerDef].statStages[STAT_EVASION] > 6 || gBattleMons[battlerAtk].statStages[STAT_ACC] < 6) + { + u32 mostDmgMoveId = GetAIMostDamagingMoveId(battlerAtk, battlerDef); + u32 *dmgs = AI_DATA->simulatedDmg[battlerAtk][battlerDef]; + if (GetNoOfHitsToKO(dmgs[mostDmgMoveId], gBattleMons[battlerDef].hp) == GetNoOfHitsToKO(dmgs[AI_THINKING_STRUCT->movesetIndex], gBattleMons[battlerDef].hp)) + score++; + } if (gBattleMons[battlerDef].statStages[STAT_EVASION] >= 10 || gBattleMons[battlerAtk].statStages[STAT_ACC] <= 2) score++; if (AI_RandLessThan(100) && (gBattleMons[battlerDef].statStages[STAT_EVASION] >= 8 || gBattleMons[battlerAtk].statStages[STAT_ACC] <= 4)) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 9fdf08123..d7e32a452 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -953,6 +953,11 @@ static u32 WhichMoveBetter(u32 move1, u32 move2) return 2; } +u32 GetNoOfHitsToKO(u32 dmg, s32 hp) +{ + return hp / (dmg + 1) + 1; +} + u8 GetMoveDamageResult(u16 move) { s32 i, checkedMove, bestId, currId, hp; @@ -1018,9 +1023,8 @@ u8 GetMoveDamageResult(u16 move) currId = AI_THINKING_STRUCT->movesetIndex; if (currId == bestId) AI_THINKING_STRUCT->funcResult = MOVE_POWER_BEST; - // Compare percentage difference. else if ((moveDmgs[currId] >= hp || moveDmgs[bestId] < hp) // If current move can faint as well, or if neither can - && (moveDmgs[bestId] * 100 / hp) - (moveDmgs[currId] * 100 / hp) <= 30 + && GetNoOfHitsToKO(moveDmgs[currId], hp) - GetNoOfHitsToKO(moveDmgs[bestId], hp) <= 2 // Consider a move weak if it needs to be used at least 2 times more to faint the target, compared to the best move. && WhichMoveBetter(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[currId]) != 0) AI_THINKING_STRUCT->funcResult = MOVE_POWER_GOOD; else From fb8989414f9d0cc83be2df1cde717e7bfacb57af Mon Sep 17 00:00:00 2001 From: Eclipse <115349505+SubzeroEclipse@users.noreply.github.com> Date: Sun, 16 Jul 2023 08:40:21 +0200 Subject: [PATCH 045/111] Fixed Mega Venasaur icon (#3137) --- graphics/pokemon/venusaur/mega/icon.png | Bin 569 -> 539 bytes src/pokemon_icon.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/graphics/pokemon/venusaur/mega/icon.png b/graphics/pokemon/venusaur/mega/icon.png index 23846ade9d9dabacbfbc232d823d2b72df4a5386..bd0bff126c09405c420db7f4a8b64fae5f336019 100644 GIT binary patch delta 490 zcmVVw9xSVnJeJT0ucUp~@Ek0004| zNklA<2UBxMvr!macfh{JEHeFjG-pP`dOi97%o ziE(f$sF65Gu2qjT2JFwf9<7DRMZN95{oU{W^rLCNI50+Bn}63luu6$;0ec3Bi|+}H zNjJP(1v=VEC@O9bCo14}y#-dy1QIegg9A+!yWc)rITYr8C?#)OfZAY%)i(tD4)qrBd;n_L-z^_(r}ZX9 z8Kgtz`-26&wv8D@5iDO`eE;)+J{k6m%BIVQAQ)JE8X3lHFT4HjP;5c3MFUh%hDa$L zEh&w@-yAW1+^NKCKW1zHXg$zar2YTUC79B|^mhry`(sWL1;#5b2MUaruWx|@6UHkr z1}ZSH2?lr$CQ)F#0*oUj0?ho6z~CkrJuiv9X5QxN5Q@mqJ$>8vO|A3$hssZ;rKPLyoN(jn8yu5hc ze48W|Nl4xFiBjJllGL)2&HD5k137}I2B@!0HYdatgny)qJ4ei(tzNeDW7f9zmIH&Q z#{WO20@L|0^HYI|7D=hWMD5`~gNd5`K4>s;)__3`23Em9-he4Jn5YF4$b|$`{1F&j z1*3hefWa;p?1GUTw2u}{ Date: Sun, 16 Jul 2023 13:26:54 +0200 Subject: [PATCH 046/111] Fix Primal Reversion not activating when switching in after fainting (#3141) * Fixed Primal Reversion not activating when switching in after a fainting * add tests for primal reversion Co-authored-by: Eduardo Quezada --- data/battle_scripts_1.s | 21 ++-- include/battle_scripts.h | 1 + include/battle_util.h | 1 + src/battle_main.c | 9 +- src/battle_script_commands.c | 3 +- src/battle_util.c | 21 ++++ test/primal_reversion.c | 216 +++++++++++++++++++++++++++++++++++ 7 files changed, 250 insertions(+), 22 deletions(-) create mode 100644 test/primal_reversion.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 28a4a33cd..39712db73 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6768,9 +6768,6 @@ BattleScript_DoSwitchOut:: hidepartystatussummary BS_ATTACKER switchinanim BS_ATTACKER, FALSE waitstate - jumpifcantreverttoprimal BattleScript_DoSwitchOut2 - call BattleScript_PrimalReversionRet -BattleScript_DoSwitchOut2: switchineffects BS_ATTACKER moveendcase MOVEEND_STATUS_IMMUNITY_ABILITIES moveendcase MOVEEND_MIRROR_MOVE @@ -7925,17 +7922,12 @@ BattleScript_WishMegaEvolution:: goto BattleScript_MegaEvolutionAfterString BattleScript_PrimalReversion:: - printstring STRINGID_EMPTYSTRING3 - waitmessage 1 - setbyte gIsCriticalHit, 0 - handleprimalreversion BS_ATTACKER, 0 - handleprimalreversion BS_ATTACKER, 1 - playanimation BS_ATTACKER, B_ANIM_PRIMAL_REVERSION - waitanimation - handleprimalreversion BS_ATTACKER, 2 - printstring STRINGID_PKMNREVERTEDTOPRIMAL - waitmessage B_WAIT_TIME_LONG - switchinabilities BS_ATTACKER + call BattleScript_PrimalReversionRet + end2 + +BattleScript_PrimalReversionRestoreAttacker:: + call BattleScript_PrimalReversionRet + copybyte gBattlerAttacker, sSAVED_BATTLER end2 BattleScript_PrimalReversionRet:: @@ -7949,6 +7941,7 @@ BattleScript_PrimalReversionRet:: handleprimalreversion BS_ATTACKER, 2 printstring STRINGID_PKMNREVERTEDTOPRIMAL waitmessage B_WAIT_TIME_LONG + switchinabilities BS_ATTACKER return BattleScript_AttackerFormChange:: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 0033b011e..b20ac35dd 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -418,6 +418,7 @@ extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; extern const u8 BattleScript_PrimalReversion[]; +extern const u8 BattleScript_PrimalReversionRestoreAttacker[]; extern const u8 BattleScript_HyperspaceFuryRemoveProtect[]; extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTactics[]; extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTacticsInPalace[]; diff --git a/include/battle_util.h b/include/battle_util.h index bd3bad8e2..aba215c12 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -142,6 +142,7 @@ u8 AtkCanceller_UnableToUseMove2(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility); u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u16 ability, u8 special, u16 moveArg); +bool32 TryPrimalReversion(u8 battlerId); bool32 IsNeutralizingGasOnField(void); u32 GetBattlerAbility(u8 battlerId); u32 IsAbilityOnSide(u32 battlerId, u32 ability); diff --git a/src/battle_main.c b/src/battle_main.c index f082fb210..3e19f247e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3861,14 +3861,9 @@ static void TryDoEventsBeforeFirstTurn(void) while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) { gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter++]; - - // Primal Reversion - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_PRIMAL_ORB - && GetBattleFormChangeTargetSpecies(gBattlerAttacker, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != SPECIES_NONE) - { - BattleScriptExecute(BattleScript_PrimalReversion); + + if (TryPrimalReversion(gBattlerAttacker)) return; - } if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerAttacker, 0, 0, 0) != 0) return; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b77f92964..74e13b6d8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7042,7 +7042,8 @@ static void SetDmgHazardsBattlescript(u8 battlerId, u8 multistringId) bool32 DoSwitchInAbilitiesItems(u32 battlerId) { - return (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battlerId, 0, 0, 0) + return (TryPrimalReversion(battlerId) + || AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battlerId, 0, 0, 0) || (gBattleWeather & B_WEATHER_ANY && WEATHER_HAS_EFFECT && AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battlerId, 0, 0, 0)) || (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY && AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battlerId, 0, 0, 0)) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battlerId, FALSE) diff --git a/src/battle_util.c b/src/battle_util.c index c9dcab3db..105b29cac 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6092,6 +6092,27 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move return effect; } +bool32 TryPrimalReversion(u8 battlerId) +{ + if (GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_PRIMAL_ORB + && GetBattleFormChangeTargetSpecies(battlerId, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != SPECIES_NONE) + { + if (gBattlerAttacker == battlerId) + { + BattleScriptExecute(BattleScript_PrimalReversion); + } + else + { + // edge case for scenarios like a switch-in after activated eject button + gBattleScripting.savedBattler = gBattlerAttacker; + gBattlerAttacker = battlerId; + BattleScriptExecute(BattleScript_PrimalReversionRestoreAttacker); + } + return TRUE; + } + return FALSE; +} + bool32 IsNeutralizingGasBannedAbility(u32 ability) { switch (ability) diff --git a/test/primal_reversion.c b/test/primal_reversion.c new file mode 100644 index 000000000..f888d17f7 --- /dev/null +++ b/test/primal_reversion.c @@ -0,0 +1,216 @@ +#include "global.h" +#include "test_battle.h" + +SINGLE_BATTLE_TEST("Primal reversion happens for Groudon only when holding Red Orb") +{ + u16 heldItem; + PARAMETRIZE { heldItem = ITEM_NONE;} + PARAMETRIZE { heldItem = ITEM_RED_ORB;} + PARAMETRIZE { heldItem = ITEM_BLUE_ORB;} + GIVEN { + PLAYER(SPECIES_GROUDON) { Item(heldItem); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } SCENE { + if (heldItem == ITEM_RED_ORB) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + } + else { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + } + } + } THEN { + if (heldItem == ITEM_RED_ORB) { + EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); + } + else { + EXPECT_EQ(player->species, SPECIES_GROUDON); + } + } +} + +SINGLE_BATTLE_TEST("Primal reversion happens for Kyogre only when holding Blue Orb") +{ + u16 heldItem; + PARAMETRIZE { heldItem = ITEM_NONE;} + PARAMETRIZE { heldItem = ITEM_RED_ORB;} + PARAMETRIZE { heldItem = ITEM_BLUE_ORB;} + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KYOGRE) { Item(heldItem); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + if (heldItem == ITEM_BLUE_ORB) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, opponent); + MESSAGE("Foe Kyogre's Primal Reversion! It reverted to its primal form!"); + } + else { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, opponent); + MESSAGE("Foe Kyogre's Primal Reversion! It reverted to its primal form!"); + } + } + } THEN { + if (heldItem == ITEM_BLUE_ORB) { + EXPECT_EQ(opponent->species, SPECIES_KYOGRE_PRIMAL); + } + else { + EXPECT_EQ(opponent->species, SPECIES_KYOGRE); + } + } +} + +DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - opponent faster") +{ + GIVEN { + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(5); }; + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(15); }; + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(10); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(20); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, opponentRight); + MESSAGE("Foe Kyogre's Primal Reversion! It reverted to its primal form!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, playerRight); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, opponentLeft); + MESSAGE("Foe Groudon's Primal Reversion! It reverted to its primal form!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, playerLeft); + MESSAGE("Kyogre's Primal Reversion! It reverted to its primal form!"); + } THEN { + EXPECT_EQ(playerLeft->species, SPECIES_KYOGRE_PRIMAL); + EXPECT_EQ(opponentLeft->species, SPECIES_GROUDON_PRIMAL); + EXPECT_EQ(opponentRight->species, SPECIES_KYOGRE_PRIMAL); + EXPECT_EQ(playerRight->species, SPECIES_GROUDON_PRIMAL); + } +} + +DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - player faster") +{ + GIVEN { + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(20); }; + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(30); }; + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(10); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(2); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, playerRight); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, playerLeft); + MESSAGE("Kyogre's Primal Reversion! It reverted to its primal form!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, opponentLeft); + MESSAGE("Foe Groudon's Primal Reversion! It reverted to its primal form!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, opponentRight); + MESSAGE("Foe Kyogre's Primal Reversion! It reverted to its primal form!"); + } THEN { + EXPECT_EQ(playerLeft->species, SPECIES_KYOGRE_PRIMAL); + EXPECT_EQ(opponentLeft->species, SPECIES_GROUDON_PRIMAL); + EXPECT_EQ(opponentRight->species, SPECIES_KYOGRE_PRIMAL); + EXPECT_EQ(playerRight->species, SPECIES_GROUDON_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Primal reversion happens after a mon is sent out after a mon is fainted") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_TACKLE].power != 0); + PLAYER(SPECIES_WOBBUFFET) {HP(1); } + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Primal reversion happens after a mon is switched in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Eject Button") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_TACKLE].power != 0); + ASSUME(gItems[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); + PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_EJECT_BUTTON); } + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + MESSAGE("Wobbuffet is switched out with the Eject Button!"); + MESSAGE("Go! Groudon!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Red Card") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_TACKLE].power != 0); + ASSUME(gItems[ITEM_RED_CARD].holdEffect == HOLD_EFFECT_RED_CARD); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET) {Item(ITEM_RED_CARD); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + MESSAGE("Foe Wobbuffet held up its Red Card against Wobbuffet!"); + MESSAGE("Groudon was dragged out!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Primal reversion happens after the entry hazards damage") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_SPIKES].effect == EFFECT_SPIKES); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); SWITCH(player, 1);} + } SCENE { + MESSAGE("Go! Groudon!"); + HP_BAR(player); + MESSAGE("Groudon is hurt by spikes!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); + } +} From 330e20b9e992a65667747f942bf5302aadcc3f5b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 17 Jul 2023 11:10:13 +0200 Subject: [PATCH 047/111] Fix Protosynthesis and Quark Drive boosts (#3139) * Fix Protosynthesis and Quark Drive boosts * Added Tests + fix newly introduced bug in the PR Add unintentionally deletet break new line --- src/battle_util.c | 12 +++-- test/ability_protosynthesis.c | 87 +++++++++++++++++++++++++++++++++++ test/ability_quark_drive.c | 87 +++++++++++++++++++++++++++++++++++ 3 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 test/ability_protosynthesis.c create mode 100644 test/ability_quark_drive.c diff --git a/src/battle_util.c b/src/battle_util.c index 105b29cac..bcd446ce6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8867,14 +8867,16 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe case ABILITY_PROTOSYNTHESIS: { u8 atkHighestStat = GetHighestStatId(battlerAtk); - if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && (atkHighestStat == STAT_ATK || atkHighestStat == STAT_SPATK)) + if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT + && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) MulModifier(&modifier, UQ_4_12(1.3)); } break; case ABILITY_QUARK_DRIVE: { u8 atkHighestStat = GetHighestStatId(battlerAtk); - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && (atkHighestStat == STAT_ATK || atkHighestStat == STAT_SPATK)) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) MulModifier(&modifier, UQ_4_12(1.3)); } break; @@ -8965,14 +8967,16 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); - if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && (defHighestStat == STAT_DEF || defHighestStat == STAT_SPDEF)) + if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT + && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) MulModifier(&modifier, UQ_4_12(0.7)); } break; case ABILITY_QUARK_DRIVE: { u8 defHighestStat = GetHighestStatId(battlerDef); - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && (defHighestStat == STAT_DEF || defHighestStat == STAT_SPDEF)) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) MulModifier(&modifier, UQ_4_12(0.7)); } break; diff --git a/test/ability_protosynthesis.c b/test/ability_protosynthesis.c new file mode 100644 index 000000000..9f794e00a --- /dev/null +++ b/test/ability_protosynthesis.c @@ -0,0 +1,87 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL); + ASSUME(gBattleMoves[MOVE_ROUND].split == SPLIT_SPECIAL); +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts the highest stat") +{ + GIVEN { + PLAYER(SPECIES_ABRA) { Ability(ABILITY_PROTOSYNTHESIS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("The harsh sunlight activated Abra's Protosynthesis!"); + MESSAGE("Abra's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts either Attack or Special Attack, not both") +{ + u16 species; + u32 move; + u16 damage[2]; + + PARAMETRIZE { species = SPECIES_BELLSPROUT; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_BELLSPROUT; move = MOVE_ROUND; } + + PARAMETRIZE { species = SPECIES_ABRA; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_ABRA; move = MOVE_ROUND; } + + GIVEN { + PLAYER(species) { Ability(ABILITY_PROTOSYNTHESIS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + TURN { MOVE(opponent, MOVE_SUNNY_DAY); MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + if ((move == MOVE_TACKLE && species == SPECIES_BELLSPROUT) || (move == MOVE_ROUND && species == SPECIES_ABRA)) + EXPECT_MUL_EQ(damage[0], Q_4_12(1.3), damage[1]); + else + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis either boosts Defense or Special Defense, not both") +{ + u16 species; + u32 move; + u16 damage[2]; + + PARAMETRIZE { species = SPECIES_ONIX; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_ONIX; move = MOVE_ROUND; } + + PARAMETRIZE { species = SPECIES_BLASTOISE; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_BLASTOISE; move = MOVE_ROUND; } + + GIVEN { + PLAYER(species) { Ability(ABILITY_PROTOSYNTHESIS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player, captureDamage: &damage[1]); + } THEN { + if ((move == MOVE_TACKLE && species == SPECIES_ONIX) || (move == MOVE_ROUND && species == SPECIES_BLASTOISE)) + EXPECT_MUL_EQ(damage[0], Q_4_12(0.7), damage[1]); + else + EXPECT_EQ(damage[0], damage[1]); + } +} diff --git a/test/ability_quark_drive.c b/test/ability_quark_drive.c new file mode 100644 index 000000000..b004c760c --- /dev/null +++ b/test/ability_quark_drive.c @@ -0,0 +1,87 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL); + ASSUME(gBattleMoves[MOVE_ROUND].split == SPLIT_SPECIAL); +} + +SINGLE_BATTLE_TEST("Quark Drive boosts the highest stat") +{ + GIVEN { + PLAYER(SPECIES_ABRA) { Ability(ABILITY_QUARK_DRIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("The Electric Terrain activated Abra's Quark Drive!"); + MESSAGE("Abra's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts either Attack or Special Attack, not both") +{ + u16 species; + u32 move; + u16 damage[2]; + + PARAMETRIZE { species = SPECIES_BELLSPROUT; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_BELLSPROUT; move = MOVE_ROUND; } + + PARAMETRIZE { species = SPECIES_ABRA; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_ABRA; move = MOVE_ROUND; } + + GIVEN { + PLAYER(species) { Ability(ABILITY_QUARK_DRIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + TURN { MOVE(opponent, MOVE_ELECTRIC_TERRAIN); MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, opponent); + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + if ((move == MOVE_TACKLE && species == SPECIES_BELLSPROUT) || (move == MOVE_ROUND && species == SPECIES_ABRA)) + EXPECT_MUL_EQ(damage[0], Q_4_12(1.3), damage[1]); + else + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Quark Drive either boosts Defense or Special Defense, not both") +{ + u16 species; + u32 move; + u16 damage[2]; + + PARAMETRIZE { species = SPECIES_ONIX; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_ONIX; move = MOVE_ROUND; } + + PARAMETRIZE { species = SPECIES_BLASTOISE; move = MOVE_TACKLE; } + PARAMETRIZE { species = SPECIES_BLASTOISE; move = MOVE_ROUND; } + + GIVEN { + PLAYER(species) { Ability(ABILITY_QUARK_DRIVE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player, captureDamage: &damage[1]); + } THEN { + if ((move == MOVE_TACKLE && species == SPECIES_ONIX) || (move == MOVE_ROUND && species == SPECIES_BLASTOISE)) + EXPECT_MUL_EQ(damage[0], Q_4_12(0.7), damage[1]); + else + EXPECT_EQ(damage[0], damage[1]); + } +} From 1b6f582600f334e9bb023e4b1bab274e10923516 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Jul 2023 15:33:44 +0200 Subject: [PATCH 048/111] tests for stamina/wind power --- test/ability_stamina.c | 89 +++++++++++++++++++++++ test/ability_wind_power.c | 145 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 test/ability_stamina.c create mode 100644 test/ability_wind_power.c diff --git a/test/ability_stamina.c b/test/ability_stamina.c new file mode 100644 index 000000000..70cf3cdc0 --- /dev/null +++ b/test/ability_stamina.c @@ -0,0 +1,89 @@ +#include "global.h" +#include "test_battle.h" + +#define STAMINA_STAT_RAISE(target, msg) \ +{ \ + ABILITY_POPUP(target, ABILITY_STAMINA); \ + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, target); \ + MESSAGE(msg); \ +} + +#define STAMINA_HIT(attacker, target, move, msg, dmgVar) \ +{ \ + ANIMATION(ANIM_TYPE_MOVE, move, attacker); \ + HP_BAR(target, captureDamage: &dmgVar); \ + STAMINA_STAT_RAISE(target, msg); \ +} + +SINGLE_BATTLE_TEST("Stamina raises Defense by 1 when hit by a move") +{ + s16 turnOneHit, turnTwoHit; + u16 move; + + PARAMETRIZE {move = MOVE_TACKLE; } + PARAMETRIZE {move = MOVE_GUST; } + + GIVEN { + ASSUME(gBattleMoves[MOVE_TACKLE].power != 0); + ASSUME(gBattleMoves[MOVE_GUST].power != 0); + ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL); + ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STAMINA); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, move); } + } SCENE { + STAMINA_HIT(opponent, player, move, "Wobbuffet's Defense rose!", turnOneHit); + STAMINA_HIT(opponent, player, move, "Wobbuffet's Defense rose!", turnTwoHit); + } + THEN { + if (move == MOVE_TACKLE) { + EXPECT_MUL_EQ(turnTwoHit, Q_4_12(1.5), turnOneHit); + } + else { + EXPECT_EQ(turnTwoHit, turnOneHit); + } + } +} + +DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the ability when hit by a multi target move") +{ + u16 abilityLeft, abilityRight; + + PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_STAMINA; } + PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_NONE; } + PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_STAMINA; } + + GIVEN { + ASSUME(gBattleMoves[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET) { Ability(abilityLeft); Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Ability(abilityRight); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) {Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) {Speed(15); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_EARTHQUAKE);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, opponentLeft); + + HP_BAR(playerLeft); + if (abilityLeft == ABILITY_STAMINA) { + STAMINA_STAT_RAISE(playerLeft, "Wobbuffet's Defense rose!"); + } + NOT HP_BAR(opponentLeft); // We need to check the attacker itself does NOT get damaged. There was an issue when the targets would get overwritten by the Stamina's stat raise. + + HP_BAR(playerRight); + if (abilityRight == ABILITY_STAMINA) { + STAMINA_STAT_RAISE(playerRight, "Wobbuffet's Defense rose!"); + } + NOT HP_BAR(opponentLeft); // We need to check the attacker itself does NOT get damaged. There was an issue when the targets would get overwritten by the Stamina's stat raise. + + HP_BAR(opponentRight); + } + THEN { + EXPECT_NE(playerLeft->hp, playerLeft->maxHP); + EXPECT_NE(playerRight->hp, playerRight->maxHP); + EXPECT_NE(opponentRight->hp, opponentRight->maxHP); + EXPECT_EQ(opponentLeft->hp, opponentLeft->maxHP); + } +} diff --git a/test/ability_wind_power.c b/test/ability_wind_power.c new file mode 100644 index 000000000..83ec47103 --- /dev/null +++ b/test/ability_wind_power.c @@ -0,0 +1,145 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_THUNDERBOLT].power != 0); + ASSUME(gBattleMoves[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(gBattleMoves[MOVE_TACKLE].power != 0); + ASSUME(gBattleMoves[MOVE_AIR_CUTTER].power != 0); + ASSUME(gBattleMoves[MOVE_AIR_CUTTER].target == MOVE_TARGET_BOTH); + ASSUME(gBattleMoves[MOVE_AIR_CUTTER].flags & FLAG_WIND_MOVE); + ASSUME(!(gBattleMoves[MOVE_TACKLE].flags & FLAG_WIND_MOVE)); +} + +SINGLE_BATTLE_TEST("Wind Power sets up Charge for player when hit by a wind move") +{ + s16 dmgBefore, dmgAfter; + u16 move; + + PARAMETRIZE {move = MOVE_TACKLE; } + PARAMETRIZE {move = MOVE_AIR_CUTTER; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_WIND_POWER); Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + } WHEN { + TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } + TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + HP_BAR(opponent, captureDamage: &dmgBefore); + + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + if (move == MOVE_AIR_CUTTER) { + ABILITY_POPUP(player, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Wobbuffet with power!"); + } + + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + HP_BAR(opponent, captureDamage: &dmgAfter); + + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + if (move == MOVE_AIR_CUTTER) { + ABILITY_POPUP(player, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Wobbuffet with power!"); + } + } + THEN { + if (move == MOVE_AIR_CUTTER) { + EXPECT_MUL_EQ(dmgBefore, Q_4_12(2.0), dmgAfter); + } + else { + EXPECT_EQ(dmgAfter, dmgBefore); + } + } +} + +SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind move") +{ + s16 dmgBefore, dmgAfter; + u16 move; + + PARAMETRIZE {move = MOVE_TACKLE; } + PARAMETRIZE {move = MOVE_AIR_CUTTER; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_WIND_POWER); Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_THUNDERBOLT), MOVE(player, move); } + TURN { MOVE(opponent, MOVE_THUNDERBOLT), MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, opponent); + HP_BAR(player, captureDamage: &dmgBefore); + + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + if (move == MOVE_AIR_CUTTER) { + ABILITY_POPUP(opponent, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Foe Wobbuffet with power!"); + } + + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, opponent); + HP_BAR(player, captureDamage: &dmgAfter); + + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + if (move == MOVE_AIR_CUTTER) { + ABILITY_POPUP(opponent, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Foe Wobbuffet with power!"); + } + } + THEN { + if (move == MOVE_AIR_CUTTER) { + EXPECT_MUL_EQ(dmgBefore, Q_4_12(2.0), dmgAfter); + } + else { + EXPECT_EQ(dmgAfter, dmgBefore); + } + } +} + +DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a multi target move") +{ + u16 abilityLeft, abilityRight; + + PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } + PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } + PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_WIND_POWER; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(abilityLeft); Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Ability(abilityRight); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(15); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_AIR_CUTTER);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AIR_CUTTER, opponentLeft); + + HP_BAR(playerLeft); + if (abilityLeft == ABILITY_WIND_POWER) { + ABILITY_POPUP(playerLeft, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Wobbuffet with power!"); + } + NOT HP_BAR(opponentLeft); + NOT HP_BAR(opponentRight); + + HP_BAR(playerRight); + if (abilityRight == ABILITY_WIND_POWER) { + ABILITY_POPUP(playerRight, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Wobbuffet with power!"); + } + NOT HP_BAR(opponentLeft); + NOT HP_BAR(opponentRight); + } + THEN { + EXPECT_NE(playerLeft->hp, playerLeft->maxHP); + EXPECT_NE(playerRight->hp, playerRight->maxHP); + EXPECT_EQ(opponentRight->hp, opponentRight->maxHP); + EXPECT_EQ(opponentLeft->hp, opponentLeft->maxHP); + } +} From 04feba83147c24fed0f533acab9b60baa054054f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Jul 2023 16:30:59 +0200 Subject: [PATCH 049/111] test for electromorphosis, small fix for wind power --- src/battle_util.c | 1 - test/ability_electromorphosis.c | 56 ++++++++++++++++++++ test/ability_wind_power.c | 90 ++++++++++++++++++++++++++++++--- 3 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 test/ability_electromorphosis.c diff --git a/src/battle_util.c b/src/battle_util.c index 105b29cac..f1048664b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5691,7 +5691,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && TARGET_TURN_DAMAGED && IsBattlerAlive(gBattlerTarget)) { - gBattlerAttacker = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WindPowerActivates; effect++; diff --git a/test/ability_electromorphosis.c b/test/ability_electromorphosis.c new file mode 100644 index 000000000..25d33aac0 --- /dev/null +++ b/test/ability_electromorphosis.c @@ -0,0 +1,56 @@ +#include "global.h" +#include "test_battle.h" + +SINGLE_BATTLE_TEST("Electromorphosis sets up Charge when hit by any move") +{ + s16 dmgBefore, dmgAfter; + u16 move; + + PARAMETRIZE {move = MOVE_TACKLE; } + PARAMETRIZE {move = MOVE_GUST; } + + GIVEN { + ASSUME(gBattleMoves[MOVE_TACKLE].power != 0); + ASSUME(gBattleMoves[MOVE_GUST].power != 0); + ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL); + ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL); + ASSUME(gBattleMoves[MOVE_THUNDERBOLT].power != 0); + ASSUME(gBattleMoves[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_ELECTROMORPHOSIS); Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + } + WHEN { + TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } + TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + HP_BAR(opponent, captureDamage: &dmgBefore); + + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_ELECTROMORPHOSIS); + if (move == MOVE_TACKLE) { + MESSAGE("Being hit by Tackle charged Wobbuffet with power!"); + } + else { + MESSAGE("Being hit by Gust charged Wobbuffet with power!"); + } + + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + HP_BAR(opponent, captureDamage: &dmgAfter); + + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_ELECTROMORPHOSIS); + if (move == MOVE_TACKLE) { + MESSAGE("Being hit by Tackle charged Wobbuffet with power!"); + } + else { + MESSAGE("Being hit by Gust charged Wobbuffet with power!"); + } + } + THEN { + EXPECT_MUL_EQ(dmgBefore, Q_4_12(2.0), dmgAfter); + } +} diff --git a/test/ability_wind_power.c b/test/ability_wind_power.c index 83ec47103..8488db269 100644 --- a/test/ability_wind_power.c +++ b/test/ability_wind_power.c @@ -9,6 +9,9 @@ ASSUMPTIONS ASSUME(gBattleMoves[MOVE_AIR_CUTTER].power != 0); ASSUME(gBattleMoves[MOVE_AIR_CUTTER].target == MOVE_TARGET_BOTH); ASSUME(gBattleMoves[MOVE_AIR_CUTTER].flags & FLAG_WIND_MOVE); + ASSUME(gBattleMoves[MOVE_PETAL_BLIZZARD].power != 0); + ASSUME(gBattleMoves[MOVE_PETAL_BLIZZARD].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(gBattleMoves[MOVE_PETAL_BLIZZARD].flags & FLAG_WIND_MOVE); ASSUME(!(gBattleMoves[MOVE_TACKLE].flags & FLAG_WIND_MOVE)); } @@ -102,11 +105,11 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo } } -DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a multi target move") +DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 2/3 target move") { - u16 abilityLeft, abilityRight; + u16 move, abilityLeft, abilityRight; - PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } + PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER;} PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_WIND_POWER; } @@ -116,7 +119,7 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(20); } OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(15); } } WHEN { - TURN { MOVE(opponentLeft, MOVE_AIR_CUTTER);} + TURN { MOVE(opponentLeft, MOVE_AIR_CUTTER); MOVE(opponentRight, MOVE_AIR_CUTTER);} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_AIR_CUTTER, opponentLeft); @@ -125,9 +128,6 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab ABILITY_POPUP(playerLeft, ABILITY_WIND_POWER); MESSAGE("Being hit by Air Cutter charged Wobbuffet with power!"); } - NOT HP_BAR(opponentLeft); - NOT HP_BAR(opponentRight); - HP_BAR(playerRight); if (abilityRight == ABILITY_WIND_POWER) { ABILITY_POPUP(playerRight, ABILITY_WIND_POWER); @@ -143,3 +143,79 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab EXPECT_EQ(opponentLeft->hp, opponentLeft->maxHP); } } + +DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 3 target move") +{ + u16 abilityLeft, abilityRight; + + PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } + PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } + PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_WIND_POWER; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(abilityLeft); Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Ability(abilityRight); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(15); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PETAL_BLIZZARD);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_BLIZZARD, opponentLeft); + + HP_BAR(playerLeft); + if (abilityLeft == ABILITY_WIND_POWER) { + ABILITY_POPUP(playerLeft, ABILITY_WIND_POWER); + MESSAGE("Being hit by PetalBlizzrd charged Wobbuffet with power!"); + } + HP_BAR(playerRight); + if (abilityRight == ABILITY_WIND_POWER) { + ABILITY_POPUP(playerRight, ABILITY_WIND_POWER); + MESSAGE("Being hit by PetalBlizzrd charged Wobbuffet with power!"); + } + HP_BAR(opponentRight); + NOT HP_BAR(opponentLeft); + } + THEN { + EXPECT_NE(playerLeft->hp, playerLeft->maxHP); + EXPECT_NE(playerRight->hp, playerRight->maxHP); + EXPECT_NE(opponentRight->hp, opponentRight->maxHP); + EXPECT_EQ(opponentLeft->hp, opponentLeft->maxHP); + } +} + +DOUBLE_BATTLE_TEST("Wind Power activates correctly when Tailwind is used") +{ + bool8 opponentSide; + + PARAMETRIZE {opponentSide = TRUE;} + PARAMETRIZE {opponentSide = FALSE;} + + GIVEN { + ASSUME(gBattleMoves[MOVE_TAILWIND].effect == EFFECT_TAILWIND); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_WIND_POWER); Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_WIND_POWER); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_WIND_POWER); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_WIND_POWER); Speed(15); } + } WHEN { + TURN { MOVE((opponentSide == TRUE) ? opponentLeft : playerLeft, MOVE_TAILWIND);} + } SCENE { + if (opponentSide) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentLeft); + + ABILITY_POPUP(opponentLeft, ABILITY_WIND_POWER); + MESSAGE("Being hit by Tailwind charged Foe Wobbuffet with power!"); + + ABILITY_POPUP(opponentRight, ABILITY_WIND_POWER); + MESSAGE("Being hit by Tailwind charged Foe Wobbuffet with power!"); + } + else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, playerLeft); + + ABILITY_POPUP(playerLeft, ABILITY_WIND_POWER); + MESSAGE("Being hit by Tailwind charged Wobbuffet with power!"); + + ABILITY_POPUP(playerRight, ABILITY_WIND_POWER); + MESSAGE("Being hit by Tailwind charged Wobbuffet with power!"); + } + } +} From 38655b9d1f59e07f223f01125a62526351fb1ccd Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 18 Jul 2023 07:11:54 +0200 Subject: [PATCH 050/111] Fix gem boost on multi hit moves and config for gem param (#3144) --- include/config/item.h | 1 + src/battle_util.c | 6 +-- src/data/items.h | 42 ++++++++++--------- test/hold_effect_gems.c | 89 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 22 deletions(-) create mode 100644 test/hold_effect_gems.c diff --git a/include/config/item.h b/include/config/item.h index 1e174b5ff..ad205f003 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -10,6 +10,7 @@ #define I_VITAMIN_EV_CAP GEN_LATEST // In Gen8+, the Vitamins no longer have a cap of 100 EV per stat. #define I_BERRY_EV_JUMP GEN_LATEST // In Gen4 only, EV-lowering Berries lower a stat's EV to 100 if it is above 100. #define I_GRISEOUS_ORB_FORM_CHANGE GEN_LATEST // In Gen9+, the Griseous Orb no longer changes Giratina's form when held. +#define I_GEM_BOOST_POWER GEN_LATEST // In Gen5+, the Gem boost power was reduced from 50% to 30%. #define I_USE_EVO_HELD_ITEMS_FROM_BAG FALSE // If TRUE, items such as Razor Claw or Electirizer will be usable from the bag to evolve a PokΓ©mon just like in LA. // TM config diff --git a/src/battle_util.c b/src/battle_util.c index bcd446ce6..9ffb4031b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9020,10 +9020,6 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe #endif MulModifier(&modifier, holdEffectModifier); break; - case HOLD_EFFECT_GEMS: - if (gSpecialStatuses[battlerAtk].gemBoost && gBattleMons[battlerAtk].item) - MulModifier(&modifier, UQ_4_12(1.0) + sPercentToModifier[gSpecialStatuses[battlerAtk].gemParam]); - break; case HOLD_EFFECT_BUG_POWER: case HOLD_EFFECT_STEEL_POWER: case HOLD_EFFECT_GROUND_POWER: @@ -9114,6 +9110,8 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe // various effects if (gProtectStructs[battlerAtk].helpingHand) MulModifier(&modifier, UQ_4_12(1.5)); + if (gSpecialStatuses[battlerAtk].gemBoost) + MulModifier(&modifier, UQ_4_12(1.0) + sPercentToModifier[gSpecialStatuses[battlerAtk].gemParam]); if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC) MulModifier(&modifier, UQ_4_12(2.0)); if (gStatuses3[battlerAtk] & STATUS3_ME_FIRST) diff --git a/src/data/items.h b/src/data/items.h index a309925aa..802cd325d 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -6,6 +6,12 @@ #define EVO_HELD_ITEM_FIELD_FUNC ItemUseOutOfBattle_CannotUse #endif +#if I_GEM_BOOST_POWER >= GEN_5 + #define GEM_BOOST_PARAM 30 +#else + #define GEM_BOOST_PARAM 50 +#endif + const struct Item gItems[] = { [ITEM_NONE] = @@ -4416,7 +4422,7 @@ const struct Item gItems[] = .itemId = ITEM_NORMAL_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sNormalGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4430,7 +4436,7 @@ const struct Item gItems[] = .itemId = ITEM_FIRE_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sFireGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4444,7 +4450,7 @@ const struct Item gItems[] = .itemId = ITEM_WATER_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sWaterGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4458,7 +4464,7 @@ const struct Item gItems[] = .itemId = ITEM_ELECTRIC_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sElectricGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4472,7 +4478,7 @@ const struct Item gItems[] = .itemId = ITEM_GRASS_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sGrassGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4486,7 +4492,7 @@ const struct Item gItems[] = .itemId = ITEM_ICE_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sIceGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4500,7 +4506,7 @@ const struct Item gItems[] = .itemId = ITEM_FIGHTING_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sFightingGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4514,7 +4520,7 @@ const struct Item gItems[] = .itemId = ITEM_POISON_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sPoisonGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4528,7 +4534,7 @@ const struct Item gItems[] = .itemId = ITEM_GROUND_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sGroundGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4542,7 +4548,7 @@ const struct Item gItems[] = .itemId = ITEM_FLYING_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sFlyingGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4556,7 +4562,7 @@ const struct Item gItems[] = .itemId = ITEM_PSYCHIC_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sPsychicGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4570,7 +4576,7 @@ const struct Item gItems[] = .itemId = ITEM_BUG_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sBugGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4584,7 +4590,7 @@ const struct Item gItems[] = .itemId = ITEM_ROCK_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sRockGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4598,7 +4604,7 @@ const struct Item gItems[] = .itemId = ITEM_GHOST_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sGhostGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4612,7 +4618,7 @@ const struct Item gItems[] = .itemId = ITEM_DRAGON_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sDragonGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4626,7 +4632,7 @@ const struct Item gItems[] = .itemId = ITEM_DARK_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sDarkGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4640,7 +4646,7 @@ const struct Item gItems[] = .itemId = ITEM_STEEL_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sSteelGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, @@ -4654,7 +4660,7 @@ const struct Item gItems[] = .itemId = ITEM_FAIRY_GEM, .price = 4000, .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 30, + .holdEffectParam = GEM_BOOST_PARAM, .description = sFairyGemDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, diff --git a/test/hold_effect_gems.c b/test/hold_effect_gems.c new file mode 100644 index 000000000..9a90b81f9 --- /dev/null +++ b/test/hold_effect_gems.c @@ -0,0 +1,89 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gItems[ITEM_NORMAL_GEM].holdEffect == HOLD_EFFECT_GEMS); +} + +SINGLE_BATTLE_TEST("Gem is consumed when it corresponds to the type of a move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_EMBER); } + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Fire Gem strengthened Wobbuffet's power!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Normal Gem strengthened Wobbuffet's power!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + } +} + +SINGLE_BATTLE_TEST("Gem boost is only applied once") +{ + s16 boostedHit; + s16 normalHit; + + GIVEN { + ASSUME(I_GEM_BOOST_POWER >= GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Normal Gem strengthened Wobbuffet's power!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + HP_BAR(opponent, captureDamage: &boostedHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + HP_BAR(opponent, captureDamage: &normalHit); + } THEN { + EXPECT_MUL_EQ(normalHit, Q_4_12(1.3), boostedHit); + } +} + +SINGLE_BATTLE_TEST("Gem modifier is used for all hits of Multi Hit Moves") +{ + s16 firstHit; + s16 secondHit; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_DOUBLE_HIT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_HIT, player); + HP_BAR(opponent, captureDamage: &firstHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_HIT, player); + HP_BAR(opponent, captureDamage: &secondHit); + } THEN { + EXPECT_EQ(firstHit, secondHit); + } +} + +SINGLE_BATTLE_TEST("Gem is consumed if the move type is changed") +{ + GIVEN { + PLAYER(SPECIES_DELCATTY) { Ability(ABILITY_NORMALIZE); Item(ITEM_NORMAL_GEM); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_FEINT_ATTACK); + } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Normal Gem strengthened Delcatty's power!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FEINT_ATTACK, player); + } +} From 43ad1a4d3b3e14deaf4e904fa11566eea6e5049b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Tue, 18 Jul 2023 03:07:14 -0400 Subject: [PATCH 051/111] Unified multi-strike move flags (#3126) * Unified twoStrikes and threeStrikes flags into strikeCount * Decreased strikeCount max from 255 to 15. --- include/pokemon.h | 3 +-- src/battle_ai_util.c | 6 +++--- src/battle_script_commands.c | 3 +-- src/battle_util.c | 16 ++++++---------- src/data/battle_moves.h | 24 ++++++++++++------------ test/move_flag_three_strikes.c | 4 ++-- 6 files changed, 25 insertions(+), 31 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index aa4f26a4c..c33e7bb81 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -376,8 +376,7 @@ struct BattleMove u32 ignoreTypeIfFlyingAndUngrounded:1; u32 thawsUser:1; u32 ignoresSubstitute:1; - u32 twoStrikes:1; // May apply its effect on each hit. - u32 threeStrikes:1; // May apply its effect on each hit. + u32 strikeCount:4; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit. u32 meFirstBanned:1; u32 gravityBanned:1; u32 mimicBanned:1; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index e9edf8dc5..3e8c5ae87 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -864,9 +864,9 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness, } // Handle other multi-strike moves - if (gBattleMoves[move].twoStrikes) - dmg *= 2; - else if (gBattleMoves[move].threeStrikes || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) + if (gBattleMoves[move].strikeCount > 1) + dmg *= gBattleMoves[move].strikeCount; + else if (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) dmg *= 3; if (dmg == 0) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f97fd2cd0..1c6a2e677 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16034,8 +16034,7 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { if (move != MOVE_NONE && move != MOVE_STRUGGLE && gBattleMoves[move].split != SPLIT_STATUS - && !gBattleMoves[move].twoStrikes - && !gBattleMoves[move].threeStrikes) + && !gBattleMoves[move].strikeCount > 2) { u32 i; for (i = 0; i < ARRAY_COUNT(sParentalBondBannedEffects); i++) diff --git a/src/battle_util.c b/src/battle_util.c index fc16d0aff..0f1613cb9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3743,21 +3743,17 @@ u8 AtkCanceller_UnableToUseMove(void) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - else if (gBattleMoves[gCurrentMove].twoStrikes) + else if (gBattleMoves[gCurrentMove].strikeCount > 1) { - gMultiHitCounter = 2; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) - if (gCurrentMove == MOVE_DRAGON_DARTS) - { - // TODO - } + gMultiHitCounter = gBattleMoves[gCurrentMove].strikeCount; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } - else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK || gBattleMoves[gCurrentMove].threeStrikes) + else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK) { gMultiHitCounter = 3; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - #if B_BEAT_UP >= GEN_5 + #if B_BEAT_UP >= GEN_5 else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP) { struct Pokemon* party = GetBattlerParty(gBattlerAttacker); @@ -3775,7 +3771,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleStruct->beatUpSlot = 0; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - #endif + #endif gBattleStruct->atkCancellerTracker++; break; case CANCELLER_END: diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 96e6e5648..00082d6ec 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -428,7 +428,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_MEGA_KICK] = @@ -716,7 +716,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .zMoveEffect = Z_EFFECT_NONE, .sheerForceBoost = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_5, // && B_UPDATED_MOVE_FLAGS > GEN_2 - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_PIN_MISSILE] = @@ -2680,7 +2680,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .priority = 0, .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_REST] = @@ -7767,7 +7767,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_ROAR_OF_TIME] = @@ -8930,7 +8930,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_HEART_STAMP] = @@ -9158,7 +9158,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_SEARING_SHOT] = @@ -11540,7 +11540,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, }, @@ -11668,7 +11668,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .priority = 0, .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_TEATIME] = @@ -12372,7 +12372,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_SCORCHING_SANDS] = @@ -12441,7 +12441,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, .punchingMove = TRUE, - .threeStrikes = TRUE, + .strikeCount = 3, .metronomeBanned = TRUE, }, @@ -13241,7 +13241,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .threeStrikes = TRUE, + .strikeCount = 3, }, [MOVE_MORTAL_SPIN] = @@ -13566,7 +13566,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .priority = 0, .split = SPLIT_SPECIAL, .zMoveEffect = Z_EFFECT_NONE, - .twoStrikes = TRUE, + .strikeCount = 2, .metronomeBanned = TRUE, }, diff --git a/test/move_flag_three_strikes.c b/test/move_flag_three_strikes.c index acb7effc0..21debc730 100644 --- a/test/move_flag_three_strikes.c +++ b/test/move_flag_three_strikes.c @@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("Three-strike flag turns a move into a 3-hit move") s16 thirdHit; GIVEN { - ASSUME(gBattleMoves[MOVE_TRIPLE_DIVE].threeStrikes); + ASSUME(gBattleMoves[MOVE_TRIPLE_DIVE].strikeCount == 3); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Surging Strikes hits 3 times with each hit being a critical s16 thirdHit; GIVEN { - ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].threeStrikes); + ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].strikeCount == 3); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { From 6fec0e4dd18015127dcb4768d5a86600753fae93 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Tue, 18 Jul 2023 03:17:03 -0400 Subject: [PATCH 052/111] Ported TheXaman's latest changes to the Debug Menu (#2815) * Added option for generating incrementing pokemon in pc boxes # Conflicts: # src/debug.c * added submenu arrows, increased menu high to full screen # Conflicts: # src/debug.c * combined flags and vars into one submenu # Conflicts: # src/debug.c * added new window to flags/vars showing the current state and added submenu indicator # Conflicts: # src/debug.c * added alligned arrows for debug submenus # Conflicts: # src/debug.c * used {CLEAR_TO X} instead of manual spaces # Conflicts: # src/debug.c * renamed gDebugText to proper sDebugText # Conflicts: # src/debug.c * added Fill submenu, added fill function for PC items and all bag pockets @LOuroboros # Conflicts: # src/debug.c * put cheat start into utility # Conflicts: # src/debug.c * put fill submenu into main menu # Conflicts: # src/debug.c * tiny fix * renaming and reordering # Conflicts: # src/debug.c * Added reset pokedex flags for @AsparagusEduardo * made flag toggle list dynamic # Conflicts: # src/debug.c * initial battle debug menu WIP # Conflicts: # src/debug.c # src/wild_encounter.c * fix visual bug * added battle start # Conflicts: # include/debug.h # src/battle_ai_script_commands.c * Added faster way to add initial movesets to mon * Added waiting music for the slow box filling * Simplified the call to scripts * Simplified debug scripts * Disabled Battle Test for now * Fixed personality on fast PC fill being always 0 * Removed BATTLE_ENGINE instances + added AI_FLAG_COUNT * Added missing return TRUE * Sets nickname * Changed how GetSpeciesName to how it's used upstream --------- Co-authored-by: TheXaman <48356183+TheXaman@users.noreply.github.com> --- data/scripts/debug.inc | 28 +- include/battle_setup.h | 3 + include/constants/battle_ai.h | 2 + include/debug.h | 3 + include/pokemon.h | 2 + include/wild_encounter.h | 1 + src/battle_ai_main.c | 6 + src/battle_main.c | 20 + src/battle_setup.c | 67 ++ src/debug.c | 1872 +++++++++++++++++++++++---------- src/pokemon.c | 34 + src/wild_encounter.c | 10 + 12 files changed, 1471 insertions(+), 577 deletions(-) diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index f9ec4eeff..d7f486907 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -1,14 +1,15 @@ .if DEBUG_OVERWORLD_MENU == TRUE - -Debug_ShowFieldMessageStringVar4:: - special ShowFieldMessageStringVar4 +Debug_MessageEnd: waitmessage waitbuttonpress releaseall end +Debug_ShowFieldMessageStringVar4:: + special ShowFieldMessageStringVar4 + goto Debug_MessageEnd + Debug_CheatStart:: - lockall setflag FLAG_SYS_POKEMON_GET setflag FLAG_RESCUED_BIRCH setflag FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE @@ -44,12 +45,8 @@ Debug_CheatStart:: end Debug_FlagsNotSetOverworldConfigMessage:: - lockall message Debug_FlagsNotSetOverworldConfigMessage_Text - waitmessage - waitbuttonpress - releaseall - end + goto Debug_MessageEnd Debug_FlagsNotSetOverworldConfigMessage_Text: .string "Feature unavailable!\n" @@ -57,18 +54,21 @@ Debug_FlagsNotSetOverworldConfigMessage_Text: .string "'include/config/overworld.h'!$" Debug_FlagsNotSetBattleConfigMessage:: - lockall message Debug_FlagsNotSetBattleConfigMessage_Text - waitmessage - waitbuttonpress - releaseall - end + goto Debug_MessageEnd Debug_FlagsNotSetBattleConfigMessage_Text: .string "Feature unavailable!\n" .string "Please define a usable flag in:\l" .string "'include/config/battle.h'!$" +Debug_BoxFilledMessage:: + message Debug_BoxFilledMessage_Text + goto Debug_MessageEnd + +Debug_BoxFilledMessage_Text: + .string "Storage boxes filled!$" + Debug_Script_1:: end diff --git a/include/battle_setup.h b/include/battle_setup.h index e29b3155f..96aeb4b76 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -68,4 +68,7 @@ bool8 IsTrainerReadyForRematch(void); void ShouldTryGetTrainerScript(void); u16 CountBattledRematchTeams(u16 trainerId); +void DoStandardWildBattle_Debug(void); +void BattleSetup_StartTrainerBattle_Debug(void); + #endif // GUARD_BATTLE_SETUP_H diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 81dbdad16..32b7f7d10 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -60,6 +60,8 @@ #define AI_FLAG_ACE_POKEMON (1 << 16) // AI has an Ace Pokemon. The last Pokemon in the party will not be used until it's the last one remaining. #define AI_FLAG_OMNISCIENT (1 << 17) // AI has full knowledge of player moves, abilities, hold items +#define AI_FLAG_COUNT 18 + // 'other' ai logic flags #define AI_FLAG_ROAMING (1 << 29) #define AI_FLAG_SAFARI (1 << 30) diff --git a/include/debug.h b/include/debug.h index 88f5f6662..d89c7994b 100644 --- a/include/debug.h +++ b/include/debug.h @@ -3,4 +3,7 @@ void Debug_ShowMainMenu(void); +extern EWRAM_DATA bool8 gIsDebugBattle; +extern EWRAM_DATA u32 gDebugAIFlags; + #endif // GUARD_DEBUG_H diff --git a/include/pokemon.h b/include/pokemon.h index c33e7bb81..90a6999b6 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -485,6 +485,8 @@ void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot); void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot); void GiveMonInitialMoveset(struct Pokemon *mon); void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon); +void GiveMonInitialMoveset_Fast(struct Pokemon *mon); +void GiveBoxMonInitialMoveset_Fast(struct BoxPokemon *boxMon); u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove); void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move); void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); diff --git a/include/wild_encounter.h b/include/wild_encounter.h index e853efbad..bef89d895 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -39,5 +39,6 @@ u16 GetLocalWildMon(bool8 *isWaterMon); u16 GetLocalWaterMon(void); bool8 UpdateRepelCounter(void); bool8 TryDoDoubleWildBattle(void); +bool8 StandardWildEncounter_Debug(void); #endif // GUARD_WILD_ENCOUNTER_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index f17111cd3..290b713b6 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -8,6 +8,7 @@ #include "battle_setup.h" #include "battle_z_move.h" #include "data.h" +#include "debug.h" #include "event_data.h" #include "item.h" #include "pokemon.h" @@ -152,6 +153,11 @@ static u32 GetWildAiFlags(void) void BattleAI_SetupFlags(void) { +#if DEBUG_OVERWORLD_MENU == TRUE + if (gIsDebugBattle) + AI_THINKING_STRUCT->aiFlags = gDebugAIFlags; + else +#endif if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) AI_THINKING_STRUCT->aiFlags = GetAiScriptsInRecordedBattle(); else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) diff --git a/src/battle_main.c b/src/battle_main.c index 6ba91a5bb..2c191512d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -16,6 +16,7 @@ #include "berry.h" #include "bg.h" #include "data.h" +#include "debug.h" #include "decompress.h" #include "dma3.h" #include "event_data.h" @@ -565,7 +566,13 @@ static void CB2_InitBattleInternal(void) gBattle_BG3_X = 0; gBattle_BG3_Y = 0; +#if DEBUG_OVERWORLD_MENU == FALSE + gBattleTerrain = BattleSetup_GetTerrainId(); +#else + if (!gIsDebugBattle) + gBattleTerrain = BattleSetup_GetTerrainId(); +#endif if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) gBattleTerrain = BATTLE_TERRAIN_BUILDING; @@ -588,6 +595,7 @@ static void CB2_InitBattleInternal(void) else SetMainCallback2(CB2_HandleStartBattle); +#if DEBUG_OVERWORLD_MENU == FALSE if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED))) { CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A, TRUE); @@ -596,6 +604,18 @@ static void CB2_InitBattleInternal(void) SetWildMonHeldItem(); CalculateEnemyPartyCount(); } +#else + if (!gIsDebugBattle) + { + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED))) + { + CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A, TRUE); + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + CreateNPCTrainerParty(&gEnemyParty[PARTY_SIZE / 2], gTrainerBattleOpponent_B, FALSE); + SetWildMonHeldItem(); + } + } +#endif gMain.inBattle = TRUE; gSaveBlock2Ptr->frontier.disableRecordBattle = FALSE; diff --git a/src/battle_setup.c b/src/battle_setup.c index 2b8e63e76..f26c69081 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -380,6 +380,41 @@ static void CreateBattleStartTask(u8 transition, u16 song) PlayMapChosenOrBattleBGM(song); } +static void Task_BattleStart_Debug(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: + if (!FldEffPoison_IsActive()) // is poison not active? + { + BattleTransition_StartOnField(tTransition); + ClearMirageTowerPulseBlendEffect(); + tState++; // go to case 1. + } + break; + case 1: + if (IsBattleTransitionDone() == TRUE) + { + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_InitBattle); + RestartWildEncounterImmunitySteps(); + ClearPoisonStepCounter(); + DestroyTask(taskId); + } + break; + } +} + +static void CreateBattleStartTask_Debug(u8 transition, u16 song) +{ + u8 taskId = CreateTask(Task_BattleStart_Debug, 1); + + gTasks[taskId].tTransition = transition; + PlayMapChosenOrBattleBGM(song); +} + #undef tState #undef tTransition @@ -422,6 +457,25 @@ static void DoStandardWildBattle(bool32 isDouble) TryUpdateGymLeaderRematchFromWild(); } +void DoStandardWildBattle_Debug(void) +{ + LockPlayerFieldControls(); + FreezeObjectEvents(); + StopPlayerAvatar(); + gMain.savedCallback = CB2_EndWildBattle; + gBattleTypeFlags = 0; + if (InBattlePyramid()) + { + VarSet(VAR_TEMP_E, 0); + gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; + } + CreateBattleStartTask_Debug(GetWildBattleTransition(), 0); + //IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + //IncrementGameStat(GAME_STAT_WILD_BATTLES); + //IncrementDailyWildBattles(); + //TryUpdateGymLeaderRematchFromWild(); +} + void BattleSetup_StartRoamerBattle(void) { LockPlayerFieldControls(); @@ -1349,6 +1403,19 @@ void BattleSetup_StartTrainerBattle(void) ScriptContext_Stop(); } +void BattleSetup_StartTrainerBattle_Debug(void) +{ + sNoOfPossibleTrainerRetScripts = gNoOfApproachingTrainers; + gNoOfApproachingTrainers = 0; + sShouldCheckTrainerBScript = FALSE; + gWhichTrainerToFaceAfterBattle = 0; + gMain.savedCallback = CB2_EndTrainerBattle; + + CreateBattleStartTask_Debug(GetWildBattleTransition(), 0); + + ScriptContext_Stop(); +} + static void CB2_EndTrainerBattle(void) { if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) diff --git a/src/debug.c b/src/debug.c index d98699b6e..ffacba9da 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,6 +8,7 @@ //Jaizu: https://jaizu.moe/ #include "global.h" #include "battle.h" +#include "battle_setup.h" #include "coins.h" #include "credits.h" #include "data.h" @@ -48,7 +49,9 @@ #include "string_util.h" #include "task.h" #include "pokemon_summary_screen.h" +#include "wild_encounter.h" #include "constants/abilities.h" +#include "constants/battle_ai.h" #include "constants/battle_frontier.h" #include "constants/flags.h" #include "constants/items.h" @@ -65,9 +68,10 @@ enum { // Main DEBUG_MENU_ITEM_UTILITIES, DEBUG_MENU_ITEM_SCRIPTS, - DEBUG_MENU_ITEM_FLAGS, - DEBUG_MENU_ITEM_VARS, + DEBUG_MENU_ITEM_FLAGVAR, + //DEBUG_MENU_ITEM_BATTLE, DEBUG_MENU_ITEM_GIVE, + DEBUG_MENU_ITEM_FILL, DEBUG_MENU_ITEM_SOUND, DEBUG_MENU_ITEM_ACCESS_PC, DEBUG_MENU_ITEM_CANCEL @@ -76,7 +80,6 @@ enum { // Util DEBUG_UTIL_MENU_ITEM_HEAL_PARTY, DEBUG_UTIL_MENU_ITEM_FLY, DEBUG_UTIL_MENU_ITEM_WARP, - DEBUG_UTIL_MENU_ITEM_RUNNING_SHOES, DEBUG_UTIL_MENU_ITEM_POISON_MONS, DEBUG_UTIL_MENU_ITEM_SAVEBLOCK, DEBUG_UTIL_MENU_ITEM_WEATHER, @@ -87,6 +90,7 @@ enum { // Util DEBUG_UTIL_MENU_ITEM_TRAINER_GENDER, DEBUG_UTIL_MENU_ITEM_TRAINER_ID, DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES, + DEBUG_UTIL_MENU_ITEM_CHEAT, }; enum { // Scripts DEBUG_UTIL_MENU_ITEM_SCRIPT_1, @@ -98,24 +102,64 @@ enum { // Scripts DEBUG_UTIL_MENU_ITEM_SCRIPT_7, DEBUG_UTIL_MENU_ITEM_SCRIPT_8, }; -enum { // Flags - DEBUG_FLAG_MENU_ITEM_FLAGS, - DEBUG_FLAG_MENU_ITEM_POKEDEXFLAGS, - DEBUG_FLAG_MENU_ITEM_POKEDEXONOFF, - DEBUG_FLAG_MENU_ITEM_NATDEXONOFF, - DEBUG_FLAG_MENU_ITEM_POKENAVONOFF, - DEBUG_FLAG_MENU_ITEM_FLYANYWHERE, - DEBUG_FLAG_MENU_ITEM_GETALLBADGES, - DEBUG_FLAG_MENU_ITEM_FRONTIER_PASS, - DEBUG_FLAG_MENU_ITEM_COLISSION_ONOFF, - DEBUG_FLAG_MENU_ITEM_ENCOUNTER_ONOFF, - DEBUG_FLAG_MENU_ITEM_TRAINER_SEE_ONOFF, - DEBUG_FLAG_MENU_ITEM_BAG_USE_ONOFF, - DEBUG_FLAG_MENU_ITEM_CATCHING_ONOFF, +enum { // Flags and Vars + DEBUG_FLAGVAR_MENU_ITEM_FLAGS, + DEBUG_FLAGVAR_MENU_ITEM_VARS, + DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL, + DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLISSION, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING, }; -enum { // Vars - DEBUG_VARS_MENU_ITEM_VARS, +enum { // Battle 0 Type + DEBUG_BATTLE_0_MENU_ITEM_WILD, + DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE, + DEBUG_BATTLE_0_MENU_ITEM_SINGLE, + DEBUG_BATTLE_0_MENU_ITEM_DOUBLE, + DEBUG_BATTLE_0_MENU_ITEM_MULTI, }; +enum { // Battle 1 AI FLags + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16, + DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17, + DEBUG_BATTLE_1_MENU_ITEM_CONTINUE, +}; +enum { // Battle 2 Terrain + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8, + DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9, +}; enum { // Give DEBUG_GIVE_MENU_ITEM_ITEM_X, DEBUG_GIVE_MENU_ITEM_ALLTMS, @@ -125,8 +169,16 @@ enum { // Give DEBUG_GIVE_MENU_ITEM_MAX_COINS, DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS, DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG, - DEBUG_GIVE_MENU_ITEM_FILL_PC, - DEBUG_GIVE_MENU_ITEM_CHEAT, +}; +enum { // Give Fill + DEBUG_FILL_MENU_ITEM_PC_BOXES_FAST, + DEBUG_FILL_MENU_ITEM_PC_BOXES_SLOW, + DEBUG_FILL_MENU_ITEM_PC_ITEMS, + DEBUG_FILL_MENU_ITEM_POCKET_ITEMS, + DEBUG_FILL_MENU_ITEM_POCKET_BALLS, + DEBUG_FILL_MENU_ITEM_POCKET_TMHM, + DEBUG_FILL_MENU_ITEM_POCKET_BERRIES, + DEBUG_FILL_MENU_ITEM_POCKET_KEY_ITEMS, }; enum { //Sound DEBUG_SOUND_MENU_ITEM_SE, @@ -135,15 +187,20 @@ enum { //Sound // ******************************* // Constants -#define DEBUG_MAIN_MENU_WIDTH 15 -#define DEBUG_MAIN_MENU_HEIGHT 8 +#define DEBUG_MENU_WIDTH_MAIN 16 +#define DEBUG_MENU_HEIGHT_MAIN 9 -#define DEBUG_NUMBER_DISPLAY_WIDTH 10 -#define DEBUG_NUMBER_DISPLAY_HEIGHT 4 -#define DEBUG_NUMBER_DISPLAY_MEDIUM_WIDTH 15 -#define DEBUG_NUMBER_DISPLAY_MEDIUM_HEIGHT 3 -#define DEBUG_NUMBER_DISPLAY_SOUND_WIDTH 20 -#define DEBUG_NUMBER_DISPLAY_SOUND_HEIGHT 6 +#define DEBUG_MENU_WIDTH_EXTRA 10 +#define DEBUG_MENU_HEIGHT_EXTRA 4 + +#define DEBUG_MENU_WIDTH_WEATHER 15 +#define DEBUG_MENU_HEIGHT_WEATHER 3 + +#define DEBUG_MENU_WIDTH_SOUND 20 +#define DEBUG_MENU_HEIGHT_SOUND 6 + +#define DEBUG_MENU_WIDTH_FLAGVAR 4 +#define DEBUG_MENU_HEIGHT_FLAGVAR 2 #define DEBUG_NUMBER_DIGITS_FLAGS 4 #define DEBUG_NUMBER_DIGITS_VARIABLES 5 @@ -154,9 +211,6 @@ enum { //Sound #define DEBUG_NUMBER_ICON_X 210 #define DEBUG_NUMBER_ICON_Y 50 -// EWRAM -static EWRAM_DATA struct DebugMonData *sDebugMonData = NULL; - // ******************************* struct DebugMonData { @@ -177,14 +231,41 @@ struct DebugMonData u16 mon_move_3; }; +struct DebugMenuListData +{ + struct ListMenuItem listItems[20 + 1]; + u8 itemNames[PC_ITEMS_COUNT + 1][26]; + u8 listId; +}; + +struct DebugBattleData +{ + u8 submenu; + u8 battleType; + u8 battleTerrain; + bool8 aiFlags[AI_FLAG_COUNT]; +}; + +// EWRAM +static EWRAM_DATA struct DebugMonData *sDebugMonData = NULL; +static EWRAM_DATA struct DebugMenuListData *sDebugMenuListData = NULL; +static EWRAM_DATA struct DebugBattleData *sDebugBattleData = NULL; +EWRAM_DATA bool8 gIsDebugBattle = FALSE; +EWRAM_DATA u32 gDebugAIFlags = 0; + // ******************************* // Define functions +static void Debug_ReShowMainMenu(void); static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMtemplate); -void Debug_ShowMainMenu(void); +static void Debug_ShowMenuDynamic(u8 taskId); static void Debug_DestroyMenu(u8 taskId); static void Debug_DestroyMenu_Full(u8 taskId); static void DebugAction_Cancel(u8 taskId); static void DebugAction_DestroyExtraWindow(u8 taskId); +static void DebugTask_HandleMenuInput(u8 taskId, void (*HandleInput)(u8)); +static void Debug_InitDebugBattleData(void); +static void Debug_RefreshListMenu(u8 taskId); +static void Debug_RedrawListMenu(u8 taskId); static void DebugAction_Util_Script_1(u8 taskId); static void DebugAction_Util_Script_2(u8 taskId); @@ -197,16 +278,19 @@ static void DebugAction_Util_Script_8(u8 taskId); static void DebugAction_OpenUtilitiesMenu(u8 taskId); static void DebugAction_OpenScriptsMenu(u8 taskId); -static void DebugAction_OpenFlagsMenu(u8 taskId); -static void DebugAction_OpenVariablesMenu(u8 taskId); +static void DebugAction_OpenFlagsVarsMenu(u8 taskId); +static void DebugAction_OpenBattleMenu(u8 taskId); static void DebugAction_OpenGiveMenu(u8 taskId); +static void DebugAction_OpenFillMenu(u8 taskId); static void DebugAction_OpenSoundMenu(u8 taskId); +static void DebugAction_AccessPC(u8 taskId); static void DebugTask_HandleMenuInput_Main(u8 taskId); static void DebugTask_HandleMenuInput_Utilities(u8 taskId); static void DebugTask_HandleMenuInput_Scripts(u8 taskId); -static void DebugTask_HandleMenuInput_Flags(u8 taskId); -static void DebugTask_HandleMenuInput_Vars(u8 taskId); +static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId); +static void DebugTask_HandleMenuInput_Battle(u8 taskId); static void DebugTask_HandleMenuInput_Give(u8 taskId); +static void DebugTask_HandleMenuInput_Fill(u8 taskId); static void DebugTask_HandleMenuInput_Sound(u8 taskId); static void DebugAction_Util_HealParty(u8 taskId); @@ -215,7 +299,7 @@ static void DebugAction_Util_Warp_Warp(u8 taskId); static void DebugAction_Util_Warp_SelectMapGroup(u8 taskId); static void DebugAction_Util_Warp_SelectMap(u8 taskId); static void DebugAction_Util_Warp_SelectWarp(u8 taskId); -static void DebugAction_Util_RunningShoes(u8 taskId); +static void DebugAction_FlagsVars_RunningShoes(u8 taskId); static void DebugAction_Util_PoisonMons(u8 taskId); static void DebugAction_Util_CheckSaveBlock(u8 taskId); static void DebugAction_Util_Weather(u8 taskId); @@ -227,26 +311,28 @@ static void DebugAction_Util_Trainer_Name(u8 taskId); static void DebugAction_Util_Trainer_Gender(u8 taskId); static void DebugAction_Util_Trainer_Id(u8 taskId); static void DebugAction_Util_Clear_Boxes(u8 taskId); +static void DebugAction_Util_CheatStart(u8 taskId); -static void DebugAction_Flags_Flags(u8 taskId); -static void DebugAction_Flags_FlagsSelect(u8 taskId); +static void DebugAction_FlagsVars_Flags(u8 taskId); +static void DebugAction_FlagsVars_FlagsSelect(u8 taskId); +static void DebugAction_FlagsVars_Vars(u8 taskId); +static void DebugAction_FlagsVars_Select(u8 taskId); +static void DebugAction_FlagsVars_SetValue(u8 taskId); +static void DebugAction_FlagsVars_PokedexFlags_All(u8 taskId); +static void DebugAction_FlagsVars_PokedexFlags_Reset(u8 taskId); +static void DebugAction_FlagsVars_SwitchDex(u8 taskId); +static void DebugAction_FlagsVars_SwitchNatDex(u8 taskId); +static void DebugAction_FlagsVars_SwitchPokeNav(u8 taskId); +static void DebugAction_FlagsVars_ToggleFlyFlags(u8 taskId); +static void DebugAction_FlagsVars_ToggleBadgeFlags(u8 taskId); +static void DebugAction_FlagsVars_ToggleFrontierPass(u8 taskId); +static void DebugAction_FlagsVars_CollisionOnOff(u8 taskId); +static void DebugAction_FlagsVars_EncounterOnOff(u8 taskId); +static void DebugAction_FlagsVars_TrainerSeeOnOff(u8 taskId); +static void DebugAction_FlagsVars_BagUseOnOff(u8 taskId); +static void DebugAction_FlagsVars_CatchingOnOff(u8 taskId); -static void DebugAction_Flags_SetPokedexFlags(u8 taskId); -static void DebugAction_Flags_SwitchDex(u8 taskId); -static void DebugAction_Flags_SwitchNatDex(u8 taskId); -static void DebugAction_Flags_SwitchPokeNav(u8 taskId); -static void DebugAction_Flags_ToggleFlyFlags(u8 taskId); -static void DebugAction_Flags_ToggleBadgeFlags(u8 taskId); -static void DebugAction_Flags_ToggleFrontierPass(u8 taskId); -static void DebugAction_Flags_CollisionOnOff(u8 taskId); -static void DebugAction_Flags_EncounterOnOff(u8 taskId); -static void DebugAction_Flags_TrainerSeeOnOff(u8 taskId); -static void DebugAction_Flags_BagUseOnOff(u8 taskId); -static void DebugAction_Flags_CatchingOnOff(u8 taskId); - -static void DebugAction_Vars_Vars(u8 taskId); -static void DebugAction_Vars_Select(u8 taskId); -static void DebugAction_Vars_SetValue(u8 taskId); +static void Debug_InitializeBattle(u8 taskId); static void DebugAction_Give_Item(u8 taskId); static void DebugAction_Give_Item_SelectId(u8 taskId); @@ -266,17 +352,21 @@ static void DebugAction_Give_MaxMoney(u8 taskId); static void DebugAction_Give_MaxCoins(u8 taskId); static void DebugAction_Give_MaxBattlePoints(u8 taskId); static void DebugAction_Give_DayCareEgg(u8 taskId); -static void DebugAction_Give_FillPC(u8 taskId); -static void DebugAction_Give_CHEAT(u8 taskId); -static void DebugAction_AccessPC(u8 taskId); + +static void DebugAction_Fill_PCBoxes_Fast(u8 taskId); +static void DebugAction_Fill_PCBoxes_Slow(u8 taskId); +static void DebugAction_Fill_PCItemStorage(u8 taskId); +static void DebugAction_Fill_PocketItems(u8 taskId); +static void DebugAction_Fill_PocketPokeBalls(u8 taskId); +static void DebugAction_Fill_PocketTMHM(u8 taskId); +static void DebugAction_Fill_PocketBerries(u8 taskId); +static void DebugAction_Fill_PocketKeyItems(u8 taskId); static void DebugAction_Sound_SE(u8 taskId); static void DebugAction_Sound_SE_SelectId(u8 taskId); static void DebugAction_Sound_MUS(u8 taskId); static void DebugAction_Sound_MUS_SelectId(u8 taskId); -static void DebugTask_HandleMenuInput(u8 taskId, void (*HandleInput)(u8)); -static void DebugAction_OpenSubMenu(u8 taskId, struct ListMenuTemplate LMtemplate); extern u8 Debug_FlagsNotSetOverworldConfigMessage[]; extern u8 Debug_FlagsNotSetBattleConfigMessage[]; @@ -294,106 +384,155 @@ extern u8 Debug_CheatStart[]; extern u8 PlayersHouse_2F_EventScript_SetWallClock[]; extern u8 PlayersHouse_2F_EventScript_CheckWallClock[]; extern u8 Debug_CheckSaveBlock[]; +extern u8 Debug_BoxFilledMessage[]; #include "data/map_group_count.h" // Text +// General +static const u8 sDebugText_True[] = _("TRUE"); +static const u8 sDebugText_False[] = _("FALSE"); +static const u8 sDebugText_Colored_True[] = _("{COLOR GREEN}TRUE"); +static const u8 sDebugText_Colored_False[] = _("{COLOR RED}FALSE"); +static const u8 sDebugText_Dashes[] = _("---"); +static const u8 sDebugText_Empty[] = _(""); +static const u8 sDebugText_Continue[] = _("Continue…{CLEAR_TO 110}{RIGHT_ARROW}"); // Main Menu -static const u8 sDebugText_Utilities[] = _("Utilities"); -static const u8 sDebugText_Scripts[] = _("Scripts"); -static const u8 sDebugText_Flags[] = _("Flags"); -static const u8 sDebugText_Vars[] = _("Variables"); -static const u8 sDebugText_Give[] = _("Give X"); -static const u8 sDebugText_Sound[] = _("Sound"); -static const u8 sDebugText_Cancel[] = _("Cancel"); +static const u8 sDebugText_Utilities[] = _("Utilities…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Scripts[] = _("Scripts…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_FlagsVars[] = _("Flags & Vars…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle[] = _("Battle Test{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Give[] = _("Give X…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Fill[] = _("Fill PC/Pockets…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Sound[] = _("Sound…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_AccessPC[] = _("Access PC…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Cancel[] = _("Cancel"); // Script menu -static const u8 sDebugText_Util_Script_1[] = _("Script 1"); -static const u8 sDebugText_Util_Script_2[] = _("Script 2"); -static const u8 sDebugText_Util_Script_3[] = _("Script 3"); -static const u8 sDebugText_Util_Script_4[] = _("Script 4"); -static const u8 sDebugText_Util_Script_5[] = _("Script 5"); -static const u8 sDebugText_Util_Script_6[] = _("Script 6"); -static const u8 sDebugText_Util_Script_7[] = _("Script 7"); -static const u8 sDebugText_Util_Script_8[] = _("Script 8"); +static const u8 sDebugText_Util_Script_1[] = _("Script 1"); +static const u8 sDebugText_Util_Script_2[] = _("Script 2"); +static const u8 sDebugText_Util_Script_3[] = _("Script 3"); +static const u8 sDebugText_Util_Script_4[] = _("Script 4"); +static const u8 sDebugText_Util_Script_5[] = _("Script 5"); +static const u8 sDebugText_Util_Script_6[] = _("Script 6"); +static const u8 sDebugText_Util_Script_7[] = _("Script 7"); +static const u8 sDebugText_Util_Script_8[] = _("Script 8"); // Util Menu -static const u8 sDebugText_Util_HealParty[] = _("Heal Party"); -static const u8 sDebugText_Util_Fly[] = _("Fly to map"); -static const u8 sDebugText_Util_WarpToMap[] = _("Warp to map warp"); -static const u8 sDebugText_Util_WarpToMap_SelectMapGroup[] = _("Group: {STR_VAR_1} \n \n\n{STR_VAR_3} "); -static const u8 sDebugText_Util_WarpToMap_SelectMap[] = _("Map: {STR_VAR_1} \nMapSec: \n{STR_VAR_2} \n{STR_VAR_3} "); -static const u8 sDebugText_Util_WarpToMap_SelectWarp[] = _("Warp: \n{STR_VAR_1} \n \n{STR_VAR_3} "); -static const u8 sDebugText_Util_WarpToMap_SelMax[] = _("{STR_VAR_1} / {STR_VAR_2}"); -static const u8 sDebugText_Util_RunningShoes[] = _("Toggle Running Shoes"); -static const u8 sDebugText_Util_PoisonMons[] = _("Poison all mons"); -static const u8 sDebugText_Util_SaveBlockSpace[] = _("SaveBlock Space"); -static const u8 sDebugText_Util_Weather[] = _("Set weather"); -static const u8 sDebugText_Util_Weather_ID[] = _("Weather Id: {STR_VAR_3}\n{STR_VAR_1}\n{STR_VAR_2}"); -static const u8 sDebugText_Util_CheckWallClock[] = _("Check Wall Clock"); -static const u8 sDebugText_Util_SetWallClock[] = _("Set Wall Clock"); -static const u8 sDebugText_Util_WatchCredits[] = _("Watch Credits"); -static const u8 sDebugText_Util_Trainer_Name[] = _("Trainer name"); -static const u8 sDebugText_Util_Trainer_Gender[] = _("Toggle T. Gender"); -static const u8 sDebugText_Util_Trainer_Id[] = _("New Trainer Id"); -static const u8 sDebugText_Util_Clear_Boxes[] = _("Clear Storage Boxes"); -// Flags Menu -static const u8 sDebugText_Flags_Flags[] = _("Set Flag XXXX"); -static const u8 sDebugText_Flags_SetPokedexFlags[] = _("All PokΓ©dex Flags"); -static const u8 sDebugText_Flags_SwitchDex[] = _("PokΓ©dex ON/OFF"); -static const u8 sDebugText_Flags_SwitchNationalDex[] = _("NatDex ON/OFF"); -static const u8 sDebugText_Flags_SwitchPokeNav[] = _("PokΓ©Nav ON/OFF"); -static const u8 sDebugText_Flags_ToggleFlyFlags[] = _("Fly Flags ON/OFF"); -static const u8 sDebugText_Flags_ToggleAllBadges[] = _("All badges ON/OFF"); -static const u8 sDebugText_Flags_ToggleFrontierPass[] = _("Frontier Pass ON/OFF"); -static const u8 sDebugText_Flags_SwitchCollision[] = _("Collision ON/OFF"); -static const u8 sDebugText_Flags_SwitchEncounter[] = _("Encounter ON/OFF"); -static const u8 sDebugText_Flags_SwitchTrainerSee[] = _("TrainerSee ON/OFF"); -static const u8 sDebugText_Flags_SwitchBagUse[] = _("BagUse ON/OFF"); -static const u8 sDebugText_Flags_SwitchCatching[] = _("Catching ON/OFF"); -static const u8 sDebugText_Flags_Flag[] = _("Flag: {STR_VAR_1} \n{STR_VAR_2} \n{STR_VAR_3}"); -static const u8 sDebugText_Flags_FlagHex[] = _("{STR_VAR_1} \n0x{STR_VAR_2} "); -static const u8 sDebugText_Flags_FlagSet[] = _("TRUE"); -static const u8 sDebugText_Flags_FlagUnset[] = _("FALSE"); -// Variables Menu -static const u8 sDebugText_Vars_Vars[] = _("Set Vars XXXX"); -static const u8 sDebugText_Vars_VariableHex[] = _("{STR_VAR_1} \n0x{STR_VAR_2} "); -static const u8 sDebugText_Vars_Variable[] = _("Var: {STR_VAR_1} \nVal: {STR_VAR_3} \n{STR_VAR_2}"); -static const u8 sDebugText_Vars_VariableValueSet[] = _("Var: {STR_VAR_1} \nVal: {STR_VAR_3} \n{STR_VAR_2}"); +static const u8 sDebugText_Util_HealParty[] = _("Heal Party"); +static const u8 sDebugText_Util_Fly[] = _("Fly to map…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Util_WarpToMap[] = _("Warp to map warp…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Util_WarpToMap_SelectMapGroup[] =_("Group: {STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n\n{STR_VAR_3}{CLEAR_TO 90}"); +static const u8 sDebugText_Util_WarpToMap_SelectMap[] = _("Map: {STR_VAR_1}{CLEAR_TO 90}\nMapSec:{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}{CLEAR_TO 90}"); +static const u8 sDebugText_Util_WarpToMap_SelectWarp[] = _("Warp:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_3}{CLEAR_TO 90}"); +static const u8 sDebugText_Util_WarpToMap_SelMax[] = _("{STR_VAR_1} / {STR_VAR_2}"); +static const u8 sDebugText_Util_PoisonMons[] = _("Poison all mons"); +static const u8 sDebugText_Util_SaveBlockSpace[] = _("SaveBlock Space…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Util_Weather[] = _("Set weather…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Util_Weather_ID[] = _("Weather Id: {STR_VAR_3}\n{STR_VAR_1}\n{STR_VAR_2}"); +static const u8 sDebugText_Util_CheckWallClock[] = _("Check Wall Clock…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Util_SetWallClock[] = _("Set Wall Clock…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Util_WatchCredits[] = _("Watch Credits…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Util_Trainer_Name[] = _("Trainer name"); +static const u8 sDebugText_Util_Trainer_Gender[] = _("Toggle T. Gender"); +static const u8 sDebugText_Util_Trainer_Id[] = _("New Trainer Id"); +static const u8 sDebugText_Util_Clear_Boxes[] = _("Clear Storage Boxes"); +static const u8 sDebugText_Util_CheatStart[] = _("CHEAT Start"); +// Flags/Vars Menu +static const u8 sDebugText_FlagsVars_Flags[] = _("Set Flag XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_FlagsVars_Flag[] = _("Flag: {STR_VAR_1}{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}"); +static const u8 sDebugText_FlagsVars_FlagHex[] = _("{STR_VAR_1}{CLEAR_TO 90}\n0x{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_FlagsVars_Vars[] = _("Set Var XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_FlagsVars_VariableHex[] = _("{STR_VAR_1}{CLEAR_TO 90}\n0x{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_FlagsVars_Variable[] = _("Var: {STR_VAR_1}{CLEAR_TO 90}\nVal: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_2}"); +static const u8 sDebugText_FlagsVars_VariableValueSet[] = _("Var: {STR_VAR_1}{CLEAR_TO 90}\nVal: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_2}"); +static const u8 sDebugText_FlagsVars_PokedexFlags_All[] = _("PokΓ©dex Flags All"); +static const u8 sDebugText_FlagsVars_PokedexFlags_Reset[] = _("PokΓ©dex Flags Reset"); +static const u8 sDebugText_FlagsVars_SwitchDex[] = _("Toggle {STR_VAR_1}PokΓ©dex"); +static const u8 sDebugText_FlagsVars_SwitchNationalDex[] = _("Toggle {STR_VAR_1}NatDex"); +static const u8 sDebugText_FlagsVars_SwitchPokeNav[] = _("Toggle {STR_VAR_1}PokΓ©Nav"); +static const u8 sDebugText_FlagsVars_RunningShoes[] = _("Toggle {STR_VAR_1}Running Shoes"); +static const u8 sDebugText_FlagsVars_ToggleFlyFlags[] = _("Toggle {STR_VAR_1}Fly Flags"); +static const u8 sDebugText_FlagsVars_ToggleAllBadges[] = _("Toggle {STR_VAR_1}All badges"); +static const u8 sDebugText_FlagsVars_ToggleFrontierPass[] = _("Toggle {STR_VAR_1}Frontier Pass"); +static const u8 sDebugText_FlagsVars_SwitchCollision[] = _("Toggle {STR_VAR_1}Collision OFF"); +static const u8 sDebugText_FlagsVars_SwitchEncounter[] = _("Toggle {STR_VAR_1}Encounter OFF"); +static const u8 sDebugText_FlagsVars_SwitchTrainerSee[] = _("Toggle {STR_VAR_1}TrainerSee OFF"); +static const u8 sDebugText_FlagsVars_SwitchBagUse[] = _("Toggle {STR_VAR_1}BagUse OFF"); +static const u8 sDebugText_FlagsVars_SwitchCatching[] = _("Toggle {STR_VAR_1}Catching OFF"); +// Battle +static const u8 sDebugText_Battle_0_Wild[] = _("Wild…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_0_WildDouble[] = _("Wild Double…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_0_Single[] = _("Single…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_0_Double[] = _("Double…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_0_Mulit[] = _("Multi…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_1_AIFlag_00[] = _("{STR_VAR_1}Check bad move"); +static const u8 sDebugText_Battle_1_AIFlag_01[] = _("{STR_VAR_1}Try to faint"); +static const u8 sDebugText_Battle_1_AIFlag_02[] = _("{STR_VAR_1}Check viability"); +static const u8 sDebugText_Battle_1_AIFlag_03[] = _("{STR_VAR_1}Setup first turn"); +static const u8 sDebugText_Battle_1_AIFlag_04[] = _("{STR_VAR_1}Risky"); +static const u8 sDebugText_Battle_1_AIFlag_05[] = _("{STR_VAR_1}Prefer strongest move"); +static const u8 sDebugText_Battle_1_AIFlag_06[] = _("{STR_VAR_1}Prefer baton pass"); +static const u8 sDebugText_Battle_1_AIFlag_07[] = _("{STR_VAR_1}Double battle"); +static const u8 sDebugText_Battle_1_AIFlag_08[] = _("{STR_VAR_1}Hp aware"); +static const u8 sDebugText_Battle_1_AIFlag_09[] = _("{STR_VAR_1}Negate unaware"); +static const u8 sDebugText_Battle_1_AIFlag_10[] = _("{STR_VAR_1}Will suicide"); +static const u8 sDebugText_Battle_1_AIFlag_11[] = _("{STR_VAR_1}Help partner"); +static const u8 sDebugText_Battle_1_AIFlag_12[] = _("{STR_VAR_1}Prefer status moves"); +static const u8 sDebugText_Battle_1_AIFlag_13[] = _("{STR_VAR_1}Stall"); +static const u8 sDebugText_Battle_1_AIFlag_14[] = _("{STR_VAR_1}Screener"); +static const u8 sDebugText_Battle_1_AIFlag_15[] = _("{STR_VAR_1}Smart switching"); +static const u8 sDebugText_Battle_1_AIFlag_16[] = _("{STR_VAR_1}Ace pokemon"); +static const u8 sDebugText_Battle_1_AIFlag_17[] = _("{STR_VAR_1}Omniscient"); +static const u8 sDebugText_Battle_2_Terrain_0[] = _("Grass…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_1[] = _("Long grass…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_2[] = _("Sand…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_3[] = _("Underwater…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_4[] = _("Water…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_5[] = _("Pond…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_6[] = _("Mountain…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_7[] = _("Cave…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_8[] = _("Building…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Battle_2_Terrain_9[] = _("Plain…{CLEAR_TO 110}{RIGHT_ARROW}"); // Give Menu -static const u8 sDebugText_Give_GiveItem[] = _("Give item XXXX"); -static const u8 sDebugText_ItemQuantity[] = _("Quantity: \n{STR_VAR_1} \n\n{STR_VAR_2}"); -static const u8 sDebugText_ItemID[] = _("Item Id: {STR_VAR_3}\n{STR_VAR_1} \n\n{STR_VAR_2}"); -static const u8 sDebugText_Give_AllTMs[] = _("Give all TMs"); -static const u8 sDebugText_Give_GivePokemonSimple[] = _("Pkm(lvl)"); -static const u8 sDebugText_Give_GivePokemonComplex[] = _("Pkm(l,s,n,a,IV,mov)"); -static const u8 sDebugText_PokemonID[] = _("Species: {STR_VAR_3}\n{STR_VAR_1} \n\n{STR_VAR_2}"); -static const u8 sDebugText_PokemonLevel[] = _("Level: \n{STR_VAR_1} \n \n{STR_VAR_2}"); -static const u8 sDebugText_PokemonShiny[] = _("Shiny: \n {STR_VAR_2} \n \n "); -static const u8 sDebugText_PokemonNature[] = _("NatureId: {STR_VAR_3} \n{STR_VAR_1} \n \n{STR_VAR_2}"); -static const u8 sDebugText_PokemonAbility[] = _("AbilityNum: {STR_VAR_3} \n{STR_VAR_1} \n \n{STR_VAR_2}"); -static const u8 sDebugText_PokemonIVs[] = _("All IVs: \n {STR_VAR_3} \n \n{STR_VAR_2} "); -static const u8 sDebugText_PokemonIV_0[] = _("IV HP: \n {STR_VAR_3} \n \n{STR_VAR_2} "); -static const u8 sDebugText_PokemonIV_1[] = _("IV Attack: \n {STR_VAR_3} \n \n{STR_VAR_2} "); -static const u8 sDebugText_PokemonIV_2[] = _("IV Defense: \n {STR_VAR_3} \n \n{STR_VAR_2} "); -static const u8 sDebugText_PokemonIV_3[] = _("IV Speed: \n {STR_VAR_3} \n \n{STR_VAR_2} "); -static const u8 sDebugText_PokemonIV_4[] = _("IV Sp. Attack: \n {STR_VAR_3} \n \n{STR_VAR_2} "); -static const u8 sDebugText_PokemonIV_5[] = _("IV Sp. Defense: \n {STR_VAR_3} \n \n{STR_VAR_2} "); -static const u8 sDebugText_PokemonMove_0[] = _("Move 0: {STR_VAR_3} \n{STR_VAR_1} \n \n{STR_VAR_2}"); -static const u8 sDebugText_PokemonMove_1[] = _("Move 1: {STR_VAR_3} \n{STR_VAR_1} \n \n{STR_VAR_2}"); -static const u8 sDebugText_PokemonMove_2[] = _("Move 2: {STR_VAR_3} \n{STR_VAR_1} \n \n{STR_VAR_2}"); -static const u8 sDebugText_PokemonMove_3[] = _("Move 3: {STR_VAR_3} \n{STR_VAR_1} \n \n{STR_VAR_2}"); -static const u8 sDebugText_Give_MaxMoney[] = _("Max Money"); -static const u8 sDebugText_Give_MaxCoins[] = _("Max Coins"); -static const u8 sDebugText_Give_BattlePoints[] = _("Max Battle Points"); -static const u8 sDebugText_Give_DaycareEgg[] = _("Daycare Egg"); -static const u8 sDebugText_Give_FillPc[] = _("Fill Pc"); -static const u8 sDebugText_Give_GiveCHEAT[] = _("CHEAT Start"); -static const u8 sDebugText_AccessPC[] = _("Access PC"); +static const u8 sDebugText_Give_GiveItem[] = _("Give item XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_ItemQuantity[] = _("Quantity:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}"); +static const u8 sDebugText_ItemID[] = _("Item Id: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}"); +static const u8 sDebugText_Give_AllTMs[] = _("Give all TMs"); +static const u8 sDebugText_Give_GivePokemonSimple[] = _("Pkm (lvl)…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Give_GivePokemonComplex[] = _("Pkm (l,s,n,a,IV,mov)…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_PokemonID[] = _("Species: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonLevel[] = _("Level:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonShiny[] = _("Shiny:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonNature[] = _("NatureId: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonAbility[] = _("AbilityNum: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonIVs[] = _("All IVs:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonIV_0[] = _("IV HP:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonIV_1[] = _("IV Attack:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonIV_2[] = _("IV Defense:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonIV_3[] = _("IV Speed:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonIV_4[] = _("IV Sp. Attack:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonIV_5[] = _("IV Sp. Defense:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonMove_0[] = _("Move 0: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonMove_1[] = _("Move 1: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonMove_2[] = _("Move 2: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_PokemonMove_3[] = _("Move 3: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); +static const u8 sDebugText_Give_MaxMoney[] = _("Max Money"); +static const u8 sDebugText_Give_MaxCoins[] = _("Max Coins"); +static const u8 sDebugText_Give_BattlePoints[] = _("Max Battle Points"); +static const u8 sDebugText_Give_DaycareEgg[] = _("Daycare Egg"); +// Fill Menu +static const u8 sDebugText_Fill_Pc_Fast[] = _("Fill PCBoxes Fast"); +static const u8 sDebugText_Fill_Pc_Slow[] = _("Fill PCBoxes Slow (LAG!)"); +static const u8 sDebugText_Fill_Pc_Items[] = _("Fill PCItems"); +static const u8 sDebugText_Fill_PocketItems[] = _("Fill Pocket Items"); +static const u8 sDebugText_Fill_PocketPokeBalls[] =_("Fill Pocket PokeBalls"); +static const u8 sDebugText_Fill_PocketTMHM[] = _("Fill Pocket TMHM"); +static const u8 sDebugText_Fill_PocketBerries[] = _("Fill Pocket Berries"); +static const u8 sDebugText_Fill_PocketKeyItems[] = _("Fill Pocket KeyItems"); // Sound Mneu -static const u8 sDebugText_Sound_SE[] = _("Effects"); -static const u8 sDebugText_Sound_SE_ID[] = _("Sound Id: {STR_VAR_3}\n{STR_VAR_1} \n{STR_VAR_2}"); -static const u8 sDebugText_Sound_MUS[] = _("Music"); -static const u8 sDebugText_Sound_MUS_ID[] = _("Music Id: {STR_VAR_3}\n{STR_VAR_1} \n{STR_VAR_2}"); -static const u8 sDebugText_Sound_Empty[] = _(""); +static const u8 sDebugText_Sound_SE[] = _("Effects…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Sound_SE_ID[] = _("Sound Id: {STR_VAR_3}\n{STR_VAR_1} \n{STR_VAR_2}"); +static const u8 sDebugText_Sound_MUS[] = _("Music…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Sound_MUS_ID[] = _("Music Id: {STR_VAR_3}\n{STR_VAR_1} \n{STR_VAR_2}"); static const u8 digitInidicator_1[] = _("{LEFT_ARROW}+1{RIGHT_ARROW} "); static const u8 digitInidicator_10[] = _("{LEFT_ARROW}+10{RIGHT_ARROW} "); @@ -432,62 +571,105 @@ static const s32 sPowersOfTen[] = // List Menu Items static const struct ListMenuItem sDebugMenu_Items_Main[] = { - [DEBUG_MENU_ITEM_UTILITIES] = {sDebugText_Utilities, DEBUG_MENU_ITEM_UTILITIES}, - [DEBUG_MENU_ITEM_SCRIPTS] = {sDebugText_Scripts, DEBUG_MENU_ITEM_SCRIPTS}, - [DEBUG_MENU_ITEM_FLAGS] = {sDebugText_Flags, DEBUG_MENU_ITEM_FLAGS}, - [DEBUG_MENU_ITEM_VARS] = {sDebugText_Vars, DEBUG_MENU_ITEM_VARS}, - [DEBUG_MENU_ITEM_GIVE] = {sDebugText_Give, DEBUG_MENU_ITEM_GIVE}, - [DEBUG_MENU_ITEM_SOUND] = {sDebugText_Sound, DEBUG_MENU_ITEM_SOUND}, - [DEBUG_MENU_ITEM_ACCESS_PC] = {sDebugText_AccessPC, DEBUG_MENU_ITEM_ACCESS_PC}, - [DEBUG_MENU_ITEM_CANCEL] = {sDebugText_Cancel, DEBUG_MENU_ITEM_CANCEL} + [DEBUG_MENU_ITEM_UTILITIES] = {sDebugText_Utilities, DEBUG_MENU_ITEM_UTILITIES}, + [DEBUG_MENU_ITEM_SCRIPTS] = {sDebugText_Scripts, DEBUG_MENU_ITEM_SCRIPTS}, + [DEBUG_MENU_ITEM_FLAGVAR] = {sDebugText_FlagsVars, DEBUG_MENU_ITEM_FLAGVAR}, + //[DEBUG_MENU_ITEM_BATTLE] = {sDebugText_Battle, DEBUG_MENU_ITEM_BATTLE}, + [DEBUG_MENU_ITEM_GIVE] = {sDebugText_Give, DEBUG_MENU_ITEM_GIVE}, + [DEBUG_MENU_ITEM_FILL] = {sDebugText_Fill, DEBUG_MENU_ITEM_FILL}, + [DEBUG_MENU_ITEM_SOUND] = {sDebugText_Sound, DEBUG_MENU_ITEM_SOUND}, + [DEBUG_MENU_ITEM_ACCESS_PC] = {sDebugText_AccessPC, DEBUG_MENU_ITEM_ACCESS_PC}, + [DEBUG_MENU_ITEM_CANCEL] = {sDebugText_Cancel, DEBUG_MENU_ITEM_CANCEL} }; static const struct ListMenuItem sDebugMenu_Items_Utilities[] = { - [DEBUG_UTIL_MENU_ITEM_HEAL_PARTY] = {sDebugText_Util_HealParty, DEBUG_UTIL_MENU_ITEM_HEAL_PARTY}, - [DEBUG_UTIL_MENU_ITEM_FLY] = {sDebugText_Util_Fly, DEBUG_UTIL_MENU_ITEM_FLY}, - [DEBUG_UTIL_MENU_ITEM_WARP] = {sDebugText_Util_WarpToMap, DEBUG_UTIL_MENU_ITEM_WARP}, - [DEBUG_UTIL_MENU_ITEM_RUNNING_SHOES] = {sDebugText_Util_RunningShoes, DEBUG_UTIL_MENU_ITEM_RUNNING_SHOES}, - [DEBUG_UTIL_MENU_ITEM_POISON_MONS] = {sDebugText_Util_PoisonMons, DEBUG_UTIL_MENU_ITEM_POISON_MONS}, - [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = {sDebugText_Util_SaveBlockSpace, DEBUG_UTIL_MENU_ITEM_SAVEBLOCK}, - [DEBUG_UTIL_MENU_ITEM_WEATHER] = {sDebugText_Util_Weather, DEBUG_UTIL_MENU_ITEM_WEATHER}, - [DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK] = {sDebugText_Util_CheckWallClock, DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK}, - [DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK] = {sDebugText_Util_SetWallClock, DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK}, - [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = {sDebugText_Util_WatchCredits, DEBUG_UTIL_MENU_ITEM_WATCHCREDITS}, - [DEBUG_UTIL_MENU_ITEM_TRAINER_NAME] = {sDebugText_Util_Trainer_Name, DEBUG_UTIL_MENU_ITEM_TRAINER_NAME}, - [DEBUG_UTIL_MENU_ITEM_TRAINER_GENDER] = {sDebugText_Util_Trainer_Gender, DEBUG_UTIL_MENU_ITEM_TRAINER_GENDER}, - [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = {sDebugText_Util_Trainer_Id, DEBUG_UTIL_MENU_ITEM_TRAINER_ID}, - [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = {sDebugText_Util_Clear_Boxes, DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES}, + [DEBUG_UTIL_MENU_ITEM_HEAL_PARTY] = {sDebugText_Util_HealParty, DEBUG_UTIL_MENU_ITEM_HEAL_PARTY}, + [DEBUG_UTIL_MENU_ITEM_FLY] = {sDebugText_Util_Fly, DEBUG_UTIL_MENU_ITEM_FLY}, + [DEBUG_UTIL_MENU_ITEM_WARP] = {sDebugText_Util_WarpToMap, DEBUG_UTIL_MENU_ITEM_WARP}, + [DEBUG_UTIL_MENU_ITEM_POISON_MONS] = {sDebugText_Util_PoisonMons, DEBUG_UTIL_MENU_ITEM_POISON_MONS}, + [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = {sDebugText_Util_SaveBlockSpace, DEBUG_UTIL_MENU_ITEM_SAVEBLOCK}, + [DEBUG_UTIL_MENU_ITEM_WEATHER] = {sDebugText_Util_Weather, DEBUG_UTIL_MENU_ITEM_WEATHER}, + [DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK] = {sDebugText_Util_CheckWallClock, DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK}, + [DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK] = {sDebugText_Util_SetWallClock, DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK}, + [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = {sDebugText_Util_WatchCredits, DEBUG_UTIL_MENU_ITEM_WATCHCREDITS}, + [DEBUG_UTIL_MENU_ITEM_TRAINER_NAME] = {sDebugText_Util_Trainer_Name, DEBUG_UTIL_MENU_ITEM_TRAINER_NAME}, + [DEBUG_UTIL_MENU_ITEM_TRAINER_GENDER] = {sDebugText_Util_Trainer_Gender, DEBUG_UTIL_MENU_ITEM_TRAINER_GENDER}, + [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = {sDebugText_Util_Trainer_Id, DEBUG_UTIL_MENU_ITEM_TRAINER_ID}, + [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = {sDebugText_Util_Clear_Boxes, DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES}, + [DEBUG_UTIL_MENU_ITEM_CHEAT] = {sDebugText_Util_CheatStart, DEBUG_UTIL_MENU_ITEM_CHEAT}, }; static const struct ListMenuItem sDebugMenu_Items_Scripts[] = { - [DEBUG_UTIL_MENU_ITEM_SCRIPT_1] = {sDebugText_Util_Script_1, DEBUG_UTIL_MENU_ITEM_SCRIPT_1}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_2] = {sDebugText_Util_Script_2, DEBUG_UTIL_MENU_ITEM_SCRIPT_2}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_3] = {sDebugText_Util_Script_3, DEBUG_UTIL_MENU_ITEM_SCRIPT_3}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_4] = {sDebugText_Util_Script_4, DEBUG_UTIL_MENU_ITEM_SCRIPT_4}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_5] = {sDebugText_Util_Script_5, DEBUG_UTIL_MENU_ITEM_SCRIPT_5}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_6] = {sDebugText_Util_Script_6, DEBUG_UTIL_MENU_ITEM_SCRIPT_6}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_7] = {sDebugText_Util_Script_7, DEBUG_UTIL_MENU_ITEM_SCRIPT_7}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_8] = {sDebugText_Util_Script_8, DEBUG_UTIL_MENU_ITEM_SCRIPT_8}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_1] = {sDebugText_Util_Script_1, DEBUG_UTIL_MENU_ITEM_SCRIPT_1}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_2] = {sDebugText_Util_Script_2, DEBUG_UTIL_MENU_ITEM_SCRIPT_2}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_3] = {sDebugText_Util_Script_3, DEBUG_UTIL_MENU_ITEM_SCRIPT_3}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_4] = {sDebugText_Util_Script_4, DEBUG_UTIL_MENU_ITEM_SCRIPT_4}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_5] = {sDebugText_Util_Script_5, DEBUG_UTIL_MENU_ITEM_SCRIPT_5}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_6] = {sDebugText_Util_Script_6, DEBUG_UTIL_MENU_ITEM_SCRIPT_6}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_7] = {sDebugText_Util_Script_7, DEBUG_UTIL_MENU_ITEM_SCRIPT_7}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_8] = {sDebugText_Util_Script_8, DEBUG_UTIL_MENU_ITEM_SCRIPT_8}, }; -static const struct ListMenuItem sDebugMenu_Items_Flags[] = +static const struct ListMenuItem sDebugMenu_Items_FlagsVars[] = { - [DEBUG_FLAG_MENU_ITEM_FLAGS] = {sDebugText_Flags_Flags, DEBUG_FLAG_MENU_ITEM_FLAGS}, - [DEBUG_FLAG_MENU_ITEM_POKEDEXFLAGS] = {sDebugText_Flags_SetPokedexFlags, DEBUG_FLAG_MENU_ITEM_POKEDEXFLAGS}, - [DEBUG_FLAG_MENU_ITEM_POKEDEXONOFF] = {sDebugText_Flags_SwitchDex, DEBUG_FLAG_MENU_ITEM_POKEDEXONOFF}, - [DEBUG_FLAG_MENU_ITEM_NATDEXONOFF] = {sDebugText_Flags_SwitchNationalDex, DEBUG_FLAG_MENU_ITEM_NATDEXONOFF}, - [DEBUG_FLAG_MENU_ITEM_POKENAVONOFF] = {sDebugText_Flags_SwitchPokeNav, DEBUG_FLAG_MENU_ITEM_POKENAVONOFF}, - [DEBUG_FLAG_MENU_ITEM_FLYANYWHERE] = {sDebugText_Flags_ToggleFlyFlags, DEBUG_FLAG_MENU_ITEM_FLYANYWHERE}, - [DEBUG_FLAG_MENU_ITEM_GETALLBADGES] = {sDebugText_Flags_ToggleAllBadges, DEBUG_FLAG_MENU_ITEM_GETALLBADGES}, - [DEBUG_FLAG_MENU_ITEM_FRONTIER_PASS] = {sDebugText_Flags_ToggleFrontierPass, DEBUG_FLAG_MENU_ITEM_FRONTIER_PASS}, - [DEBUG_FLAG_MENU_ITEM_COLISSION_ONOFF] = {sDebugText_Flags_SwitchCollision, DEBUG_FLAG_MENU_ITEM_COLISSION_ONOFF}, - [DEBUG_FLAG_MENU_ITEM_ENCOUNTER_ONOFF] = {sDebugText_Flags_SwitchEncounter, DEBUG_FLAG_MENU_ITEM_ENCOUNTER_ONOFF}, - [DEBUG_FLAG_MENU_ITEM_TRAINER_SEE_ONOFF] = {sDebugText_Flags_SwitchTrainerSee, DEBUG_FLAG_MENU_ITEM_TRAINER_SEE_ONOFF}, - [DEBUG_FLAG_MENU_ITEM_BAG_USE_ONOFF] = {sDebugText_Flags_SwitchBagUse, DEBUG_FLAG_MENU_ITEM_BAG_USE_ONOFF}, - [DEBUG_FLAG_MENU_ITEM_CATCHING_ONOFF] = {sDebugText_Flags_SwitchCatching, DEBUG_FLAG_MENU_ITEM_CATCHING_ONOFF}, + [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = {sDebugText_FlagsVars_Flags, DEBUG_FLAGVAR_MENU_ITEM_FLAGS}, + [DEBUG_FLAGVAR_MENU_ITEM_VARS] = {sDebugText_FlagsVars_Vars, DEBUG_FLAGVAR_MENU_ITEM_VARS}, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = {sDebugText_FlagsVars_PokedexFlags_All, DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL}, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = {sDebugText_FlagsVars_PokedexFlags_Reset, DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = {sDebugText_FlagsVars_SwitchDex, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = {sDebugText_FlagsVars_SwitchNationalDex, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = {sDebugText_FlagsVars_SwitchPokeNav, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = {sDebugText_FlagsVars_RunningShoes, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = {sDebugText_FlagsVars_ToggleFlyFlags, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = {sDebugText_FlagsVars_ToggleAllBadges, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = {sDebugText_FlagsVars_ToggleFrontierPass, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLISSION] = {sDebugText_FlagsVars_SwitchCollision, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLISSION}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = {sDebugText_FlagsVars_SwitchEncounter, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = {sDebugText_FlagsVars_SwitchTrainerSee, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = {sDebugText_FlagsVars_SwitchBagUse, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = {sDebugText_FlagsVars_SwitchCatching, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING}, }; -static const struct ListMenuItem sDebugMenu_Items_Vars[] = +static const struct ListMenuItem sDebugMenu_Items_Battle_0[] = { - [DEBUG_VARS_MENU_ITEM_VARS] = {sDebugText_Vars_Vars, DEBUG_FLAG_MENU_ITEM_FLAGS}, + [DEBUG_BATTLE_0_MENU_ITEM_WILD] = {sDebugText_Battle_0_Wild, DEBUG_BATTLE_0_MENU_ITEM_WILD}, + [DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE] = {sDebugText_Battle_0_WildDouble, DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE}, + [DEBUG_BATTLE_0_MENU_ITEM_SINGLE] = {sDebugText_Battle_0_Single, DEBUG_BATTLE_0_MENU_ITEM_SINGLE}, + [DEBUG_BATTLE_0_MENU_ITEM_DOUBLE] = {sDebugText_Battle_0_Double, DEBUG_BATTLE_0_MENU_ITEM_DOUBLE}, + [DEBUG_BATTLE_0_MENU_ITEM_MULTI] = {sDebugText_Battle_0_Mulit, DEBUG_BATTLE_0_MENU_ITEM_MULTI}, +}; +static const struct ListMenuItem sDebugMenu_Items_Battle_1[] = +{ + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00] = {sDebugText_Battle_1_AIFlag_00, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01] = {sDebugText_Battle_1_AIFlag_01, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02] = {sDebugText_Battle_1_AIFlag_02, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03] = {sDebugText_Battle_1_AIFlag_03, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04] = {sDebugText_Battle_1_AIFlag_04, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05] = {sDebugText_Battle_1_AIFlag_05, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06] = {sDebugText_Battle_1_AIFlag_06, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07] = {sDebugText_Battle_1_AIFlag_07, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08] = {sDebugText_Battle_1_AIFlag_08, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09] = {sDebugText_Battle_1_AIFlag_09, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10] = {sDebugText_Battle_1_AIFlag_10, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11] = {sDebugText_Battle_1_AIFlag_11, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12] = {sDebugText_Battle_1_AIFlag_12, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13] = {sDebugText_Battle_1_AIFlag_13, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14] = {sDebugText_Battle_1_AIFlag_14, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15] = {sDebugText_Battle_1_AIFlag_15, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16] = {sDebugText_Battle_1_AIFlag_16, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17] = {sDebugText_Battle_1_AIFlag_17, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17}, + [DEBUG_BATTLE_1_MENU_ITEM_CONTINUE] = {sDebugText_Continue, DEBUG_BATTLE_1_MENU_ITEM_CONTINUE}, +}; +static const struct ListMenuItem sDebugMenu_Items_Battle_2[] = +{ + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0] = {sDebugText_Battle_2_Terrain_0, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1] = {sDebugText_Battle_2_Terrain_1, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2] = {sDebugText_Battle_2_Terrain_2, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3] = {sDebugText_Battle_2_Terrain_3, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4] = {sDebugText_Battle_2_Terrain_4, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5] = {sDebugText_Battle_2_Terrain_5, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6] = {sDebugText_Battle_2_Terrain_6, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7] = {sDebugText_Battle_2_Terrain_7, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8] = {sDebugText_Battle_2_Terrain_8, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9] = {sDebugText_Battle_2_Terrain_9, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9}, }; static const struct ListMenuItem sDebugMenu_Items_Give[] = { @@ -499,44 +681,54 @@ static const struct ListMenuItem sDebugMenu_Items_Give[] = [DEBUG_GIVE_MENU_ITEM_MAX_COINS] = {sDebugText_Give_MaxCoins, DEBUG_GIVE_MENU_ITEM_MAX_COINS}, [DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS] = {sDebugText_Give_BattlePoints, DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS}, [DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG] = {sDebugText_Give_DaycareEgg, DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG}, - [DEBUG_GIVE_MENU_ITEM_FILL_PC] = {sDebugText_Give_FillPc, DEBUG_GIVE_MENU_ITEM_FILL_PC}, - [DEBUG_GIVE_MENU_ITEM_CHEAT] = {sDebugText_Give_GiveCHEAT, DEBUG_GIVE_MENU_ITEM_CHEAT}, +}; +static const struct ListMenuItem sDebugMenu_Items_Fill[] = +{ + [DEBUG_FILL_MENU_ITEM_PC_BOXES_FAST] = {sDebugText_Fill_Pc_Fast, DEBUG_FILL_MENU_ITEM_PC_BOXES_FAST}, + [DEBUG_FILL_MENU_ITEM_PC_BOXES_SLOW] = {sDebugText_Fill_Pc_Slow, DEBUG_FILL_MENU_ITEM_PC_BOXES_SLOW}, + [DEBUG_FILL_MENU_ITEM_PC_ITEMS] = {sDebugText_Fill_Pc_Items , DEBUG_FILL_MENU_ITEM_PC_ITEMS}, + [DEBUG_FILL_MENU_ITEM_POCKET_ITEMS] = {sDebugText_Fill_PocketItems, DEBUG_FILL_MENU_ITEM_POCKET_ITEMS}, + [DEBUG_FILL_MENU_ITEM_POCKET_BALLS] = {sDebugText_Fill_PocketPokeBalls, DEBUG_FILL_MENU_ITEM_POCKET_BALLS}, + [DEBUG_FILL_MENU_ITEM_POCKET_TMHM] = {sDebugText_Fill_PocketTMHM, DEBUG_FILL_MENU_ITEM_POCKET_TMHM}, + [DEBUG_FILL_MENU_ITEM_POCKET_BERRIES] = {sDebugText_Fill_PocketBerries, DEBUG_FILL_MENU_ITEM_POCKET_BERRIES}, + [DEBUG_FILL_MENU_ITEM_POCKET_KEY_ITEMS] = {sDebugText_Fill_PocketKeyItems, DEBUG_FILL_MENU_ITEM_POCKET_KEY_ITEMS}, }; static const struct ListMenuItem sDebugMenu_Items_Sound[] = { - [DEBUG_SOUND_MENU_ITEM_SE] = {sDebugText_Sound_SE, DEBUG_SOUND_MENU_ITEM_SE}, - [DEBUG_SOUND_MENU_ITEM_MUS] = {sDebugText_Sound_MUS, DEBUG_SOUND_MENU_ITEM_MUS}, + [DEBUG_SOUND_MENU_ITEM_SE] = {sDebugText_Sound_SE, DEBUG_SOUND_MENU_ITEM_SE}, + [DEBUG_SOUND_MENU_ITEM_MUS] = {sDebugText_Sound_MUS, DEBUG_SOUND_MENU_ITEM_MUS}, }; // ******************************* // Menu Actions static void (*const sDebugMenu_Actions_Main[])(u8) = { - [DEBUG_MENU_ITEM_UTILITIES] = DebugAction_OpenUtilitiesMenu, - [DEBUG_MENU_ITEM_SCRIPTS] = DebugAction_OpenScriptsMenu, - [DEBUG_MENU_ITEM_FLAGS] = DebugAction_OpenFlagsMenu, - [DEBUG_MENU_ITEM_VARS] = DebugAction_OpenVariablesMenu, - [DEBUG_MENU_ITEM_GIVE] = DebugAction_OpenGiveMenu, - [DEBUG_MENU_ITEM_SOUND] = DebugAction_OpenSoundMenu, - [DEBUG_MENU_ITEM_ACCESS_PC] = DebugAction_AccessPC, - [DEBUG_MENU_ITEM_CANCEL] = DebugAction_Cancel + [DEBUG_MENU_ITEM_UTILITIES] = DebugAction_OpenUtilitiesMenu, + [DEBUG_MENU_ITEM_SCRIPTS] = DebugAction_OpenScriptsMenu, + [DEBUG_MENU_ITEM_FLAGVAR] = DebugAction_OpenFlagsVarsMenu, + //[DEBUG_MENU_ITEM_BATTLE] = DebugAction_OpenBattleMenu, + [DEBUG_MENU_ITEM_GIVE] = DebugAction_OpenGiveMenu, + [DEBUG_MENU_ITEM_FILL] = DebugAction_OpenFillMenu, + [DEBUG_MENU_ITEM_SOUND] = DebugAction_OpenSoundMenu, + [DEBUG_MENU_ITEM_ACCESS_PC] = DebugAction_AccessPC, + [DEBUG_MENU_ITEM_CANCEL] = DebugAction_Cancel }; static void (*const sDebugMenu_Actions_Utilities[])(u8) = { - [DEBUG_UTIL_MENU_ITEM_HEAL_PARTY] = DebugAction_Util_HealParty, - [DEBUG_UTIL_MENU_ITEM_FLY] = DebugAction_Util_Fly, - [DEBUG_UTIL_MENU_ITEM_WARP] = DebugAction_Util_Warp_Warp, - [DEBUG_UTIL_MENU_ITEM_RUNNING_SHOES] = DebugAction_Util_RunningShoes, - [DEBUG_UTIL_MENU_ITEM_POISON_MONS] = DebugAction_Util_PoisonMons, - [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = DebugAction_Util_CheckSaveBlock, - [DEBUG_UTIL_MENU_ITEM_WEATHER] = DebugAction_Util_Weather, - [DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK] = DebugAction_Util_CheckWallClock, - [DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK] = DebugAction_Util_SetWallClock, - [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = DebugAction_Util_WatchCredits, - [DEBUG_UTIL_MENU_ITEM_TRAINER_NAME] = DebugAction_Util_Trainer_Name, - [DEBUG_UTIL_MENU_ITEM_TRAINER_GENDER] = DebugAction_Util_Trainer_Gender, - [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = DebugAction_Util_Trainer_Id, - [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = DebugAction_Util_Clear_Boxes, + [DEBUG_UTIL_MENU_ITEM_HEAL_PARTY] = DebugAction_Util_HealParty, + [DEBUG_UTIL_MENU_ITEM_FLY] = DebugAction_Util_Fly, + [DEBUG_UTIL_MENU_ITEM_WARP] = DebugAction_Util_Warp_Warp, + [DEBUG_UTIL_MENU_ITEM_POISON_MONS] = DebugAction_Util_PoisonMons, + [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = DebugAction_Util_CheckSaveBlock, + [DEBUG_UTIL_MENU_ITEM_WEATHER] = DebugAction_Util_Weather, + [DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK] = DebugAction_Util_CheckWallClock, + [DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK] = DebugAction_Util_SetWallClock, + [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = DebugAction_Util_WatchCredits, + [DEBUG_UTIL_MENU_ITEM_TRAINER_NAME] = DebugAction_Util_Trainer_Name, + [DEBUG_UTIL_MENU_ITEM_TRAINER_GENDER] = DebugAction_Util_Trainer_Gender, + [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = DebugAction_Util_Trainer_Id, + [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = DebugAction_Util_Clear_Boxes, + [DEBUG_UTIL_MENU_ITEM_CHEAT] = DebugAction_Util_CheatStart, }; static void (*const sDebugMenu_Actions_Scripts[])(u8) = { @@ -551,23 +743,22 @@ static void (*const sDebugMenu_Actions_Scripts[])(u8) = }; static void (*const sDebugMenu_Actions_Flags[])(u8) = { - [DEBUG_FLAG_MENU_ITEM_FLAGS] = DebugAction_Flags_Flags, - [DEBUG_FLAG_MENU_ITEM_POKEDEXFLAGS] = DebugAction_Flags_SetPokedexFlags, - [DEBUG_FLAG_MENU_ITEM_POKEDEXONOFF] = DebugAction_Flags_SwitchDex, - [DEBUG_FLAG_MENU_ITEM_NATDEXONOFF] = DebugAction_Flags_SwitchNatDex, - [DEBUG_FLAG_MENU_ITEM_POKENAVONOFF] = DebugAction_Flags_SwitchPokeNav, - [DEBUG_FLAG_MENU_ITEM_FLYANYWHERE] = DebugAction_Flags_ToggleFlyFlags, - [DEBUG_FLAG_MENU_ITEM_GETALLBADGES] = DebugAction_Flags_ToggleBadgeFlags, - [DEBUG_FLAG_MENU_ITEM_FRONTIER_PASS] = DebugAction_Flags_ToggleFrontierPass, - [DEBUG_FLAG_MENU_ITEM_COLISSION_ONOFF] = DebugAction_Flags_CollisionOnOff, - [DEBUG_FLAG_MENU_ITEM_ENCOUNTER_ONOFF] = DebugAction_Flags_EncounterOnOff, - [DEBUG_FLAG_MENU_ITEM_TRAINER_SEE_ONOFF] = DebugAction_Flags_TrainerSeeOnOff, - [DEBUG_FLAG_MENU_ITEM_BAG_USE_ONOFF] = DebugAction_Flags_BagUseOnOff, - [DEBUG_FLAG_MENU_ITEM_CATCHING_ONOFF] = DebugAction_Flags_CatchingOnOff, -}; -static void (*const sDebugMenu_Actions_Vars[])(u8) = -{ - [DEBUG_VARS_MENU_ITEM_VARS] = DebugAction_Vars_Vars, + [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = DebugAction_FlagsVars_Flags, + [DEBUG_FLAGVAR_MENU_ITEM_VARS] = DebugAction_FlagsVars_Vars, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = DebugAction_FlagsVars_PokedexFlags_All, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = DebugAction_FlagsVars_PokedexFlags_Reset, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = DebugAction_FlagsVars_SwitchDex, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = DebugAction_FlagsVars_SwitchNatDex, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = DebugAction_FlagsVars_SwitchPokeNav, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = DebugAction_FlagsVars_RunningShoes, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = DebugAction_FlagsVars_ToggleFlyFlags, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = DebugAction_FlagsVars_ToggleBadgeFlags, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = DebugAction_FlagsVars_ToggleFrontierPass, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLISSION] = DebugAction_FlagsVars_CollisionOnOff, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = DebugAction_FlagsVars_EncounterOnOff, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = DebugAction_FlagsVars_TrainerSeeOnOff, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = DebugAction_FlagsVars_BagUseOnOff, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = DebugAction_FlagsVars_CatchingOnOff, }; static void (*const sDebugMenu_Actions_Give[])(u8) = { @@ -579,9 +770,19 @@ static void (*const sDebugMenu_Actions_Give[])(u8) = [DEBUG_GIVE_MENU_ITEM_MAX_COINS] = DebugAction_Give_MaxCoins, [DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS] = DebugAction_Give_MaxBattlePoints, [DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG] = DebugAction_Give_DayCareEgg, - [DEBUG_GIVE_MENU_ITEM_FILL_PC] = DebugAction_Give_FillPC, - [DEBUG_GIVE_MENU_ITEM_CHEAT] = DebugAction_Give_CHEAT, }; +static void (*const sDebugMenu_Actions_Fill[])(u8) = +{ + [DEBUG_FILL_MENU_ITEM_PC_BOXES_FAST] = DebugAction_Fill_PCBoxes_Fast, + [DEBUG_FILL_MENU_ITEM_PC_BOXES_SLOW] = DebugAction_Fill_PCBoxes_Slow, + [DEBUG_FILL_MENU_ITEM_PC_ITEMS] = DebugAction_Fill_PCItemStorage, + [DEBUG_FILL_MENU_ITEM_POCKET_ITEMS] = DebugAction_Fill_PocketItems, + [DEBUG_FILL_MENU_ITEM_POCKET_BALLS] = DebugAction_Fill_PocketPokeBalls, + [DEBUG_FILL_MENU_ITEM_POCKET_TMHM] = DebugAction_Fill_PocketTMHM, + [DEBUG_FILL_MENU_ITEM_POCKET_BERRIES] = DebugAction_Fill_PocketBerries, + [DEBUG_FILL_MENU_ITEM_POCKET_KEY_ITEMS] = DebugAction_Fill_PocketKeyItems, +}; + static void (*const sDebugMenu_Actions_Sound[])(u8) = { [DEBUG_SOUND_MENU_ITEM_SE] = DebugAction_Sound_SE, @@ -591,46 +792,56 @@ static void (*const sDebugMenu_Actions_Sound[])(u8) = // ******************************* // Windows -static const struct WindowTemplate sDebugMenuWindowTemplate = +static const struct WindowTemplate sDebugMenuWindowTemplateMain = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, - .width = DEBUG_MAIN_MENU_WIDTH, - .height = 2 * DEBUG_MAIN_MENU_HEIGHT, + .width = DEBUG_MENU_WIDTH_MAIN, + .height = 2 * DEBUG_MENU_HEIGHT_MAIN, .paletteNum = 15, .baseBlock = 1, }; -static const struct WindowTemplate sDebugNumberDisplayWindowTemplate = +static const struct WindowTemplate sDebugMenuWindowTemplateExtra = { .bg = 0, - .tilemapLeft = 4 + DEBUG_MAIN_MENU_WIDTH, + .tilemapLeft = 30 - DEBUG_MENU_WIDTH_EXTRA - 1, .tilemapTop = 1, - .width = DEBUG_NUMBER_DISPLAY_WIDTH, - .height = 2 * DEBUG_NUMBER_DISPLAY_HEIGHT, + .width = DEBUG_MENU_WIDTH_EXTRA, + .height = 2 * DEBUG_MENU_HEIGHT_EXTRA, .paletteNum = 15, .baseBlock = 1, }; -static const struct WindowTemplate sDebugNumberDisplayMediumWindowTemplate = +static const struct WindowTemplate sDebugMenuWindowTemplateWeather = { .bg = 0, - .tilemapLeft = 30 - DEBUG_NUMBER_DISPLAY_MEDIUM_WIDTH - 1, + .tilemapLeft = 30 - DEBUG_MENU_WIDTH_WEATHER - 1, .tilemapTop = 1, - .width = DEBUG_NUMBER_DISPLAY_MEDIUM_WIDTH, - .height = 2 * DEBUG_NUMBER_DISPLAY_MEDIUM_HEIGHT, + .width = DEBUG_MENU_WIDTH_WEATHER, + .height = 2 * DEBUG_MENU_HEIGHT_WEATHER, .paletteNum = 15, .baseBlock = 1, }; -static const struct WindowTemplate sDebugNumberDisplayLargeWindowTemplate = +static const struct WindowTemplate sDebugMenuWindowTemplateSound = { .bg = 0, - .tilemapLeft = 30 - DEBUG_NUMBER_DISPLAY_SOUND_WIDTH -1, + .tilemapLeft = 30 - DEBUG_MENU_WIDTH_SOUND - 1, .tilemapTop = 1, - .width = DEBUG_NUMBER_DISPLAY_SOUND_WIDTH, - .height = DEBUG_NUMBER_DISPLAY_SOUND_HEIGHT, + .width = DEBUG_MENU_WIDTH_SOUND, + .height = DEBUG_MENU_HEIGHT_SOUND, .paletteNum = 15, .baseBlock = 1, }; +static const struct WindowTemplate sDebugMenuWindowTemplateFlagsVars = +{ + .bg = 0, + .tilemapLeft = 30 - DEBUG_MENU_WIDTH_FLAGVAR - 1, + .tilemapTop = 1, + .width = DEBUG_MENU_WIDTH_FLAGVAR, + .height = DEBUG_MENU_HEIGHT_FLAGVAR, + .paletteNum = 15, + .baseBlock = 1 + DEBUG_MENU_WIDTH_MAIN * DEBUG_MENU_HEIGHT_MAIN * 2, +}; // ******************************* // List Menu Templates @@ -652,17 +863,29 @@ static const struct ListMenuTemplate sDebugMenu_ListTemplate_Scripts = .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .totalItems = ARRAY_COUNT(sDebugMenu_Items_Scripts), }; -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Flags = +static const struct ListMenuTemplate sDebugMenu_ListTemplate_FlagsVars = { - .items = sDebugMenu_Items_Flags, + .items = sDebugMenu_Items_FlagsVars, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Flags), + .totalItems = ARRAY_COUNT(sDebugMenu_Items_FlagsVars), }; -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Vars = +static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_0 = { - .items = sDebugMenu_Items_Vars, + .items = sDebugMenu_Items_Battle_0, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Vars), + .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_0), +}; +static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_1 = +{ + .items = sDebugMenu_Items_Battle_1, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_1), +}; +static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_2 = +{ + .items = sDebugMenu_Items_Battle_2, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_2), }; static const struct ListMenuTemplate sDebugMenu_ListTemplate_Give = { @@ -670,6 +893,12 @@ static const struct ListMenuTemplate sDebugMenu_ListTemplate_Give = .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .totalItems = ARRAY_COUNT(sDebugMenu_Items_Give), }; +static const struct ListMenuTemplate sDebugMenu_ListTemplate_Fill = +{ + .items = sDebugMenu_Items_Fill, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .totalItems = ARRAY_COUNT(sDebugMenu_Items_Fill), +}; static const struct ListMenuTemplate sDebugMenu_ListTemplate_Sound = { .items = sDebugMenu_Items_Sound, @@ -681,6 +910,14 @@ static const struct ListMenuTemplate sDebugMenu_ListTemplate_Sound = // ******************************* // Functions universal void Debug_ShowMainMenu(void) +{ + sDebugBattleData = AllocZeroed(sizeof(*sDebugBattleData)); + sDebugMenuListData = AllocZeroed(sizeof(*sDebugMenuListData)); + Debug_InitDebugBattleData(); + + Debug_ShowMenu(DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); +} +static void Debug_ReShowMainMenu(void) { Debug_ShowMenu(DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } @@ -694,12 +931,12 @@ static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMte // create window HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugMenuWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateMain); DrawStdWindowFrame(windowId, FALSE); // create list menu menuTemplate = LMtemplate; - menuTemplate.maxShowed = DEBUG_MAIN_MENU_HEIGHT; + menuTemplate.maxShowed = DEBUG_MENU_HEIGHT_MAIN; menuTemplate.windowId = windowId; menuTemplate.header_X = 0; menuTemplate.item_X = 8; @@ -715,13 +952,17 @@ static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMte menuTemplate.cursorKind = 0; menuTaskId = ListMenuInit(&menuTemplate, 0, 0); - // draw everything - CopyWindowToVram(windowId, 3); - // create input handler task inputTaskId = CreateTask(HandleInput, 3); gTasks[inputTaskId].data[0] = menuTaskId; gTasks[inputTaskId].data[1] = windowId; + gTasks[inputTaskId].data[2] = 0; + + Debug_RefreshListMenu(inputTaskId); + //Debug_ShowMenuDynamic(inputTaskId); + + // draw everything + CopyWindowToVram(windowId, 3); } static void Debug_DestroyMenu(u8 taskId) { @@ -731,11 +972,25 @@ static void Debug_DestroyMenu(u8 taskId) } static void Debug_DestroyMenu_Full(u8 taskId) { + if (gTasks[taskId].data[2] != 0) + { + ClearStdWindowAndFrame(gTasks[taskId].data[2], FALSE); + DebugAction_DestroyExtraWindow(taskId); + } DestroyListMenuTask(gTasks[taskId].data[0], NULL, NULL); ClearStdWindowAndFrame(gTasks[taskId].data[1], TRUE); RemoveWindow(gTasks[taskId].data[1]); DestroyTask(taskId); UnfreezeObjectEvents(); + Free(sDebugMenuListData); + Free(sDebugBattleData); +} +static void Debug_DestroyMenu_Full_Script(u8 taskId, const u8 *script) +{ + Debug_DestroyMenu_Full(taskId); + LockPlayerFieldControls(); + FreezeObjectEvents(); + ScriptContext_SetupScript(script); } static void DebugAction_Cancel(u8 taskId) { @@ -756,6 +1011,216 @@ static void DebugAction_DestroyExtraWindow(u8 taskId) UnfreezeObjectEvents(); } +static u8 Debug_CheckToggleFlags(u8 id) +{ + u8 result = FALSE; + + switch (id) + { + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX: + result = FlagGet(FLAG_SYS_POKEDEX_GET); + break; + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX: + result = IsNationalPokedexEnabled(); + break; + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV: + result = FlagGet(FLAG_SYS_POKENAV_GET); + break; + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES: + result = FlagGet(FLAG_SYS_B_DASH); + break; + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS: + result = FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) && + FlagGet(FLAG_VISITED_OLDALE_TOWN) && + FlagGet(FLAG_VISITED_DEWFORD_TOWN) && + FlagGet(FLAG_VISITED_LAVARIDGE_TOWN) && + FlagGet(FLAG_VISITED_FALLARBOR_TOWN) && + FlagGet(FLAG_VISITED_VERDANTURF_TOWN) && + FlagGet(FLAG_VISITED_PACIFIDLOG_TOWN) && + FlagGet(FLAG_VISITED_PETALBURG_CITY) && + FlagGet(FLAG_VISITED_SLATEPORT_CITY) && + FlagGet(FLAG_VISITED_MAUVILLE_CITY) && + FlagGet(FLAG_VISITED_RUSTBORO_CITY) && + FlagGet(FLAG_VISITED_FORTREE_CITY) && + FlagGet(FLAG_VISITED_LILYCOVE_CITY) && + FlagGet(FLAG_VISITED_MOSSDEEP_CITY) && + FlagGet(FLAG_VISITED_SOOTOPOLIS_CITY) && + FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) && + FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && + FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER); + break; + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL: + result = FlagGet(FLAG_BADGE01_GET) && + FlagGet(FLAG_BADGE02_GET) && + FlagGet(FLAG_BADGE03_GET) && + FlagGet(FLAG_BADGE04_GET) && + FlagGet(FLAG_BADGE05_GET) && + FlagGet(FLAG_BADGE06_GET) && + FlagGet(FLAG_BADGE07_GET) && + FlagGet(FLAG_BADGE08_GET); + break; + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS: + result = FlagGet(FLAG_SYS_FRONTIER_PASS); + break; + #if OW_FLAG_NO_COLLISION != 0 + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLISSION: + result = FlagGet(OW_FLAG_NO_COLLISION); + break; + #endif + #if OW_FLAG_NO_ENCOUNTER != 0 + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER: + result = FlagGet(OW_FLAG_NO_ENCOUNTER); + break; + #endif + #if OW_FLAG_NO_TRAINER_SEE != 0 + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE: + result = FlagGet(OW_FLAG_NO_TRAINER_SEE); + break; + #endif + #if B_FLAG_NO_BAG_USE != 0 + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE: + result = FlagGet(B_FLAG_NO_BAG_USE); + break; + #endif + #if B_FLAG_NO_CATCHING != 0 + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING: + result = FlagGet(B_FLAG_NO_CATCHING); + break; + #endif + default: + result = 0xFF; + break; + } + + return result; +} + +static void Debug_InitDebugBattleData(void) +{ + u32 i; + sDebugBattleData->submenu = 0; + sDebugBattleData->battleType = 0xFF; + sDebugBattleData->battleTerrain = 0xFF; + + for (i = 0; i < AI_FLAG_COUNT; i++) + sDebugBattleData->aiFlags[i] = FALSE; +} + +static void Debug_RefreshListMenu(u8 taskId) +{ + u16 i; + const u8 sColor_Red[] = _("{COLOR RED}"); + const u8 sColor_Green[] = _("{COLOR GREEN}"); + u8 listTaskId = gTasks[taskId].data[0]; + struct ListMenu *list = (void*) gTasks[listTaskId].data; + u8 totalItems, flagResult; + u8 const * name; + + if (sDebugMenuListData->listId == 0) + { + gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_FlagsVars; + totalItems = gMultiuseListMenuTemplate.totalItems; + } + else if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu <= 1) + { + gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_Battle_1; + totalItems = gMultiuseListMenuTemplate.totalItems; + } + else if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu > 1) + { + gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_Battle_2; + totalItems = 7; + } + + // Copy item names for all entries but the last (which is Cancel) + for(i = 0; i < totalItems; i++) + { + + if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu > 1) + { + u16 species; + if (i == 6) + { + name = sDebugText_Continue; + StringCopy(&sDebugMenuListData->itemNames[i][0], name); + } + else if (GetMonData(&gEnemyParty[i], MON_DATA_SANITY_HAS_SPECIES)) + { + species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); + StringCopy(gStringVar1, GetSpeciesName(species)); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar1); + } + else + { + StringCopy(&sDebugMenuListData->itemNames[i][0], sDebugText_Dashes); + } + } + else + { + if (sDebugMenuListData->listId == 0) + { + flagResult = Debug_CheckToggleFlags(i); + name = sDebugMenu_Items_FlagsVars[i].name; + } + else if (sDebugMenuListData->listId == 1) + { + flagResult = sDebugBattleData->aiFlags[i]; + if (i == totalItems - 1) + flagResult == 0xFF; + name = sDebugMenu_Items_Battle_1[i].name; + } + + if (flagResult == 0xFF) + { + StringCopy(&sDebugMenuListData->itemNames[i][0], name); + } + else if (flagResult) + { + StringCopy(gStringVar1, sColor_Green); + StringExpandPlaceholders(gStringVar4, name); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); + } + else + { + StringCopy(gStringVar1, sColor_Red); + StringExpandPlaceholders(gStringVar4, name); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); + } + } + + sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; + sDebugMenuListData->listItems[i].id = i; + } + + // Set list menu data + gMultiuseListMenuTemplate.items = sDebugMenuListData->listItems; + gMultiuseListMenuTemplate.totalItems = totalItems; + gMultiuseListMenuTemplate.maxShowed = DEBUG_MENU_HEIGHT_MAIN; + gMultiuseListMenuTemplate.windowId = gTasks[taskId].data[1]; + gMultiuseListMenuTemplate.header_X = 0; + gMultiuseListMenuTemplate.item_X = 8; + gMultiuseListMenuTemplate.cursor_X = 0; + gMultiuseListMenuTemplate.upText_Y = 1; + gMultiuseListMenuTemplate.cursorPal = 2; + gMultiuseListMenuTemplate.fillValue = 1; + gMultiuseListMenuTemplate.cursorShadowPal = 3; + gMultiuseListMenuTemplate.lettersSpacing = 1; + gMultiuseListMenuTemplate.itemVerticalPadding = 0; + gMultiuseListMenuTemplate.scrollMultiple = LIST_NO_MULTIPLE_SCROLL; + gMultiuseListMenuTemplate.fontId = 1; + gMultiuseListMenuTemplate.cursorKind = 0; +} +static void Debug_RedrawListMenu(u8 taskId) +{ + u8 listTaskId = gTasks[taskId].data[0]; + u16 scrollOffset, selectedRow; + ListMenuGetScrollAndRow(listTaskId, &scrollOffset, &selectedRow); + + DestroyListMenuTask(gTasks[taskId].data[0], &scrollOffset, &selectedRow); + Debug_RefreshListMenu(taskId); + gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, scrollOffset, selectedRow); +} + // ******************************* // Handle Inputs @@ -792,7 +1257,7 @@ static void DebugTask_HandleMenuInput_Utilities(u8 taskId) { PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ShowMainMenu(); + Debug_ReShowMainMenu(); } } static void DebugTask_HandleMenuInput_Scripts(u8 taskId) @@ -810,10 +1275,10 @@ static void DebugTask_HandleMenuInput_Scripts(u8 taskId) { PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ShowMainMenu(); + Debug_ReShowMainMenu(); } } -static void DebugTask_HandleMenuInput_Flags(u8 taskId) +static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId) { void (*func)(u8); u32 input = ListMenu_ProcessInput(gTasks[taskId].data[0]); @@ -822,33 +1287,185 @@ static void DebugTask_HandleMenuInput_Flags(u8 taskId) { PlaySE(SE_SELECT); if ((func = sDebugMenu_Actions_Flags[input]) != NULL) + { func(taskId); + + // Remove TRUE/FALSE window for functions that haven't been assigned flags + if (gTasks[taskId].data[3] == 0xFF) + { + ClearStdWindowAndFrame(gTasks[taskId].data[2], TRUE); + RemoveWindow(gTasks[taskId].data[2]); + Free(sDebugMenuListData); + } + else + Debug_RedrawListMenu(taskId); + } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ShowMainMenu(); + + ClearStdWindowAndFrame(gTasks[taskId].data[2], TRUE); + RemoveWindow(gTasks[taskId].data[2]); + + Debug_ReShowMainMenu(); } } -static void DebugTask_HandleMenuInput_Vars(u8 taskId) + +static void DebugTask_HandleBattleMenuReDraw(u8 taskId) +{ + Debug_RefreshListMenu(taskId); + switch (sDebugBattleData->submenu) + { + case 0: + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_0); + break; + case 1: + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); + break; + case 2: + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); + break; + case 3: + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); + break; + } +} +static void DebugTask_HandleMenuInput_Battle(u8 taskId) { void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].data[0]); + u8 listTaskId = gTasks[taskId].data[0]; + u32 input = ListMenu_ProcessInput(listTaskId); + u16 idx; - if (JOY_NEW(A_BUTTON)) - { + ListMenuGetCurrentItemArrayId(listTaskId, &idx); + + if (gMain.newKeys & A_BUTTON) + { PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Vars[input]) != NULL) - func(taskId); + + switch (sDebugBattleData->submenu) + { + case 0: // Battle type + sDebugBattleData->battleType = idx; + sDebugBattleData->submenu++; + Debug_DestroyMenu(taskId); + + if (sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD // Skip AI Flag selection if wild battle + || sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE) + { + sDebugBattleData->submenu++; + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); + } + else + { + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); + } + break; + case 1: // AI Flags + if (idx == sDebugMenu_ListTemplate_Battle_1.totalItems - 1) + { + sDebugBattleData->submenu++; + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); + } + else + { + sDebugBattleData->aiFlags[idx] = !sDebugBattleData->aiFlags[idx]; + Debug_RedrawListMenu(taskId); + } + + break; + case 2: // Terrain + sDebugBattleData->submenu++; + sDebugBattleData->battleTerrain = idx; + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); + break; + case 3: // Enemy pokemon + if (idx == 6) + Debug_InitializeBattle(taskId); + break; + } } - else if (JOY_NEW(B_BUTTON)) + else if (gMain.newKeys & B_BUTTON) { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ShowMainMenu(); + switch (sDebugBattleData->submenu) + { + case 0: // Return to Main menu + PlaySE(SE_SELECT); + Debug_DestroyMenu(taskId); + Debug_ReShowMainMenu(); + break; + case 2: // Skip AI Flag selection if wild battle + if (sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD + || sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE) + { + sDebugBattleData->submenu = 0; + } + else + sDebugBattleData->submenu--; + DebugTask_HandleBattleMenuReDraw(taskId); + break; + default: + sDebugBattleData->submenu--; + DebugTask_HandleBattleMenuReDraw(taskId); + break; + } } } + +static void Debug_InitializeBattle(u8 taskId) +{ + u32 i; + gBattleTypeFlags = 0; + + // Set main battle flags + switch (sDebugBattleData->battleType) + { + case DEBUG_BATTLE_0_MENU_ITEM_WILD: + break; + case DEBUG_BATTLE_0_MENU_ITEM_SINGLE: + gBattleTypeFlags = (BATTLE_TYPE_TRAINER); + break; + case DEBUG_BATTLE_0_MENU_ITEM_DOUBLE: + gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER); + break; + case DEBUG_BATTLE_0_MENU_ITEM_MULTI: + gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER); + break; + } + + // Set terrain + gBattleTerrain = sDebugBattleData->battleTerrain; + + // Populate enemy party + for (i = 0; i < PARTY_SIZE; i++) + { + ZeroMonData(&gEnemyParty[i]); + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)) + gEnemyParty[i] = gPlayerParty[i]; + } + + // Set AI flags + for (i = 0; i < ARRAY_COUNT(sDebugBattleData->aiFlags); i++) + { + if (sDebugBattleData->aiFlags[i]) + gDebugAIFlags |= (1 << i); + } + + gIsDebugBattle = TRUE; + BattleSetup_StartTrainerBattle_Debug(); + + + Debug_DestroyMenu_Full(taskId); +} + static void DebugTask_HandleMenuInput_Give(u8 taskId) { void (*func)(u8); @@ -864,7 +1481,25 @@ static void DebugTask_HandleMenuInput_Give(u8 taskId) { PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ShowMainMenu(); + Debug_ReShowMainMenu(); + } +} +static void DebugTask_HandleMenuInput_Fill(u8 taskId) +{ + void (*func)(u8); + u32 input = ListMenu_ProcessInput(gTasks[taskId].data[0]); + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if ((func = sDebugMenu_Actions_Fill[input]) != NULL) + func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Debug_DestroyMenu(taskId); + Debug_ReShowMainMenu(); } } static void DebugTask_HandleMenuInput_Sound(u8 taskId) @@ -882,7 +1517,7 @@ static void DebugTask_HandleMenuInput_Sound(u8 taskId) { PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ShowMainMenu(); + Debug_ReShowMainMenu(); } } @@ -898,28 +1533,36 @@ static void DebugAction_OpenScriptsMenu(u8 taskId) Debug_DestroyMenu(taskId); Debug_ShowMenu(DebugTask_HandleMenuInput_Scripts, sDebugMenu_ListTemplate_Scripts); } -static void DebugAction_OpenFlagsMenu(u8 taskId) +static void DebugAction_OpenFlagsVarsMenu(u8 taskId) { Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Flags, sDebugMenu_ListTemplate_Flags); + sDebugMenuListData->listId = 0; + Debug_ShowMenu(DebugTask_HandleMenuInput_FlagsVars, gMultiuseListMenuTemplate); } -static void DebugAction_OpenVariablesMenu(u8 taskId) + +static void DebugAction_OpenBattleMenu(u8 taskId) { Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Vars, sDebugMenu_ListTemplate_Vars); + sDebugMenuListData->listId = 1; + Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_0); } + static void DebugAction_OpenGiveMenu(u8 taskId) { Debug_DestroyMenu(taskId); Debug_ShowMenu(DebugTask_HandleMenuInput_Give, sDebugMenu_ListTemplate_Give); } +static void DebugAction_OpenFillMenu(u8 taskId) +{ + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Fill, sDebugMenu_ListTemplate_Fill); +} static void DebugAction_OpenSoundMenu(u8 taskId) { Debug_DestroyMenu(taskId); Debug_ShowMenu(DebugTask_HandleMenuInput_Sound, sDebugMenu_ListTemplate_Sound); } - // ******************************* // Actions Utilities static void DebugAction_Util_HealParty(u8 taskId) @@ -962,7 +1605,7 @@ static void DebugAction_Util_Warp_Warp(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -1138,20 +1781,6 @@ static void DebugAction_Util_Warp_SelectWarp(u8 taskId) } } -static void DebugAction_Util_RunningShoes(u8 taskId) -{ - if (FlagGet(FLAG_SYS_B_DASH)) - { - FlagClear(FLAG_SYS_B_DASH); - PlaySE(SE_PC_OFF); - } - else - { - FlagSet(FLAG_SYS_B_DASH); - PlaySE(SE_PC_LOGIN); - } -} - static void DebugAction_Util_PoisonMons(u8 taskId) { int i; @@ -1229,7 +1858,7 @@ static void DebugAction_Util_Weather(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayMediumWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateWeather); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -1304,15 +1933,11 @@ static void DebugAction_Util_Weather_SelectId(u8 taskId) static void DebugAction_Util_CheckWallClock(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(PlayersHouse_2F_EventScript_CheckWallClock); + Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_CheckWallClock); } static void DebugAction_Util_SetWallClock(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(PlayersHouse_2F_EventScript_SetWallClock); + Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_SetWallClock); } static void DebugAction_Util_WatchCredits(u8 taskId) { @@ -1347,61 +1972,49 @@ static void DebugAction_Util_Clear_Boxes(u8 taskId) Debug_DestroyMenu_Full(taskId); ScriptContext_Enable(); } +static void DebugAction_Util_CheatStart(u8 taskId) +{ + Debug_DestroyMenu_Full_Script(taskId, Debug_CheatStart); +} // ******************************* // Actions Scripts static void DebugAction_Util_Script_1(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_1); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_1); } static void DebugAction_Util_Script_2(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_2); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_2); } static void DebugAction_Util_Script_3(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_3); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_3); } static void DebugAction_Util_Script_4(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_4); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_4); } static void DebugAction_Util_Script_5(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_5); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_5); } static void DebugAction_Util_Script_6(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_6); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_6); } static void DebugAction_Util_Script_7(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_7); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_7); } static void DebugAction_Util_Script_8(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_Script_8); + Debug_DestroyMenu_Full_Script(taskId, Debug_Script_8); } // ******************************* -// Actions Flags -static void DebugAction_Flags_Flags(u8 taskId) +// Actions Flags and Vars +static void DebugAction_FlagsVars_Flags(u8 taskId) { u8 windowId; @@ -1410,7 +2023,7 @@ static void DebugAction_Flags_Flags(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -1418,21 +2031,21 @@ static void DebugAction_Flags_Flags(u8 taskId) //Display initial Flag ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_FLAGS); ConvertIntToHexStringN(gStringVar2, 1, STR_CONV_MODE_LEFT_ALIGN, 3); - StringExpandPlaceholders(gStringVar1, sDebugText_Flags_FlagHex); - if (FlagGet(FLAG_TEMP_1) == TRUE) - StringCopyPadded(gStringVar2, sDebugText_Flags_FlagSet, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar1, sDebugText_FlagsVars_FlagHex); + if (FlagGet(FLAG_TEMP_1)) + StringCopyPadded(gStringVar2, sDebugText_True, CHAR_SPACE, 15); else - StringCopyPadded(gStringVar2, sDebugText_Flags_FlagUnset, CHAR_SPACE, 15); + StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); StringCopy(gStringVar3, gText_DigitIndicator[0]); - StringExpandPlaceholders(gStringVar4, sDebugText_Flags_Flag); + StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Flag); AddTextPrinterParameterized(windowId, 1, gStringVar4, 1, 1, 0, NULL); - gTasks[taskId].func = DebugAction_Flags_FlagsSelect; + gTasks[taskId].func = DebugAction_FlagsVars_FlagsSelect; gTasks[taskId].data[2] = windowId; gTasks[taskId].data[3] = FLAG_TEMP_1; //Current Flag gTasks[taskId].data[4] = 0; //Digit Selected } -static void DebugAction_Flags_FlagsSelect(u8 taskId) +static void DebugAction_FlagsVars_FlagsSelect(u8 taskId) { if (JOY_NEW(A_BUTTON)) FlagToggle(gTasks[taskId].data[3]); @@ -1482,184 +2095,18 @@ static void DebugAction_Flags_FlagsSelect(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[3], STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_FLAGS); ConvertIntToHexStringN(gStringVar2, gTasks[taskId].data[3], STR_CONV_MODE_LEFT_ALIGN, 3); - StringExpandPlaceholders(gStringVar1, sDebugText_Flags_FlagHex); + StringExpandPlaceholders(gStringVar1, sDebugText_FlagsVars_FlagHex); if (FlagGet(gTasks[taskId].data[3]) == TRUE) - StringCopyPadded(gStringVar2, sDebugText_Flags_FlagSet, CHAR_SPACE, 15); + StringCopyPadded(gStringVar2, sDebugText_True, CHAR_SPACE, 15); else - StringCopyPadded(gStringVar2, sDebugText_Flags_FlagUnset, CHAR_SPACE, 15); + StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); StringCopy(gStringVar3, gText_DigitIndicator[gTasks[taskId].data[4]]); - StringExpandPlaceholders(gStringVar4, sDebugText_Flags_Flag); + StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Flag); AddTextPrinterParameterized(gTasks[taskId].data[2], 1, gStringVar4, 1, 1, 0, NULL); } } -static void DebugAction_Flags_SetPokedexFlags(u8 taskId) -{ - u16 i; - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - GetSetPokedexFlag(i + 1, FLAG_SET_CAUGHT); - GetSetPokedexFlag(i + 1, FLAG_SET_SEEN); - } - Debug_DestroyMenu_Full(taskId); - ScriptContext_Enable(); -} -static void DebugAction_Flags_SwitchDex(u8 taskId) -{ - if (FlagGet(FLAG_SYS_POKEDEX_GET)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(FLAG_SYS_POKEDEX_GET); -} -static void DebugAction_Flags_SwitchNatDex(u8 taskId) -{ - if (IsNationalPokedexEnabled()) - { - DisableNationalPokedex(); - PlaySE(SE_PC_OFF); - } - else - { - EnableNationalPokedex(); - PlaySE(SE_PC_LOGIN); - } -} -static void DebugAction_Flags_SwitchPokeNav(u8 taskId) -{ - if (FlagGet(FLAG_SYS_POKENAV_GET)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(FLAG_SYS_POKENAV_GET); -} -static void DebugAction_Flags_ToggleFlyFlags(u8 taskId) -{ - // Sound effect - if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - - FlagToggle(FLAG_VISITED_LITTLEROOT_TOWN); - FlagToggle(FLAG_VISITED_OLDALE_TOWN); - FlagToggle(FLAG_VISITED_DEWFORD_TOWN); - FlagToggle(FLAG_VISITED_LAVARIDGE_TOWN); - FlagToggle(FLAG_VISITED_FALLARBOR_TOWN); - FlagToggle(FLAG_VISITED_VERDANTURF_TOWN); - FlagToggle(FLAG_VISITED_PACIFIDLOG_TOWN); - FlagToggle(FLAG_VISITED_PETALBURG_CITY); - FlagToggle(FLAG_VISITED_SLATEPORT_CITY); - FlagToggle(FLAG_VISITED_MAUVILLE_CITY); - FlagToggle(FLAG_VISITED_RUSTBORO_CITY); - FlagToggle(FLAG_VISITED_FORTREE_CITY); - FlagToggle(FLAG_VISITED_LILYCOVE_CITY); - FlagToggle(FLAG_VISITED_MOSSDEEP_CITY); - FlagToggle(FLAG_VISITED_SOOTOPOLIS_CITY); - FlagToggle(FLAG_VISITED_EVER_GRANDE_CITY); - FlagToggle(FLAG_LANDMARK_POKEMON_LEAGUE); - FlagToggle(FLAG_LANDMARK_BATTLE_FRONTIER); -} -static void DebugAction_Flags_ToggleBadgeFlags(u8 taskId) -{ - // Sound effect - if (FlagGet(FLAG_BADGE08_GET)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - - FlagToggle(FLAG_BADGE01_GET); - FlagToggle(FLAG_BADGE02_GET); - FlagToggle(FLAG_BADGE03_GET); - FlagToggle(FLAG_BADGE04_GET); - FlagToggle(FLAG_BADGE05_GET); - FlagToggle(FLAG_BADGE06_GET); - FlagToggle(FLAG_BADGE07_GET); - FlagToggle(FLAG_BADGE08_GET); -} -static void DebugAction_Flags_ToggleFrontierPass(u8 taskId) -{ - // Sound effect - if (FlagGet(FLAG_SYS_FRONTIER_PASS)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(FLAG_SYS_FRONTIER_PASS); -} -static void DebugAction_Flags_CollisionOnOff(u8 taskId) -{ -#if OW_FLAG_NO_COLLISION == 0 - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_FlagsNotSetOverworldConfigMessage); -#else - if (FlagGet(OW_FLAG_NO_COLLISION)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(OW_FLAG_NO_COLLISION); -#endif -} -static void DebugAction_Flags_EncounterOnOff(u8 taskId) -{ -#if OW_FLAG_NO_ENCOUNTER == 0 - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_FlagsNotSetOverworldConfigMessage); -#else - if (FlagGet(OW_FLAG_NO_ENCOUNTER)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(OW_FLAG_NO_ENCOUNTER); -#endif -} -static void DebugAction_Flags_TrainerSeeOnOff(u8 taskId) -{ -#if OW_FLAG_NO_TRAINER_SEE == 0 - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_FlagsNotSetOverworldConfigMessage); -#else - if (FlagGet(OW_FLAG_NO_TRAINER_SEE)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(OW_FLAG_NO_TRAINER_SEE); -#endif -} -static void DebugAction_Flags_BagUseOnOff(u8 taskId) -{ -#if B_FLAG_NO_BAG_USE == 0 - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_FlagsNotSetBattleConfigMessage); -#else - if (FlagGet(B_FLAG_NO_BAG_USE)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(B_FLAG_NO_BAG_USE); -#endif -} -static void DebugAction_Flags_CatchingOnOff(u8 taskId) -{ -#if B_FLAG_NO_CATCHING == 0 - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_FlagsNotSetBattleConfigMessage); -#else - if (FlagGet(B_FLAG_NO_CATCHING)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(B_FLAG_NO_CATCHING); -#endif -} - -// ******************************* -// Actions Variables -static void DebugAction_Vars_Vars(u8 taskId) +static void DebugAction_FlagsVars_Vars(u8 taskId) { u8 windowId; @@ -1668,7 +2115,7 @@ static void DebugAction_Vars_Vars(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -1676,21 +2123,21 @@ static void DebugAction_Vars_Vars(u8 taskId) //Display initial Variable ConvertIntToDecimalStringN(gStringVar1, VARS_START, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_VARIABLES); ConvertIntToHexStringN(gStringVar2, VARS_START, STR_CONV_MODE_LEFT_ALIGN, 4); - StringExpandPlaceholders(gStringVar1, sDebugText_Vars_VariableHex); + StringExpandPlaceholders(gStringVar1, sDebugText_FlagsVars_VariableHex); ConvertIntToDecimalStringN(gStringVar3, 0, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_VARIABLES); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); StringCopy(gStringVar2, gText_DigitIndicator[0]); - StringExpandPlaceholders(gStringVar4, sDebugText_Vars_Variable); + StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Variable); AddTextPrinterParameterized(windowId, 1, gStringVar4, 1, 1, 0, NULL); - gTasks[taskId].func = DebugAction_Vars_Select; + gTasks[taskId].func = DebugAction_FlagsVars_Select; gTasks[taskId].data[2] = windowId; gTasks[taskId].data[3] = VARS_START; //Current Variable gTasks[taskId].data[4] = 0; //Digit Selected gTasks[taskId].data[5] = 0; //Current Variable VALUE } -static void DebugAction_Vars_Select(u8 taskId) +static void DebugAction_FlagsVars_Select(u8 taskId) { if (JOY_NEW(DPAD_UP)) { @@ -1723,7 +2170,7 @@ static void DebugAction_Vars_Select(u8 taskId) ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[3], STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_VARIABLES); ConvertIntToHexStringN(gStringVar2, gTasks[taskId].data[3], STR_CONV_MODE_LEFT_ALIGN, 4); - StringExpandPlaceholders(gStringVar1, sDebugText_Vars_VariableHex); + StringExpandPlaceholders(gStringVar1, sDebugText_FlagsVars_VariableHex); if (VarGetIfExist(gTasks[taskId].data[3]) == 65535) //Current value, if 65535 the value hasnt been set gTasks[taskId].data[5] = 0; else @@ -1732,7 +2179,7 @@ static void DebugAction_Vars_Select(u8 taskId) StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].data[4]]); //Current digit //Combine str's to full window string - StringExpandPlaceholders(gStringVar4, sDebugText_Vars_Variable); + StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Variable); AddTextPrinterParameterized(gTasks[taskId].data[2], 1, gStringVar4, 1, 1, 0, NULL); } @@ -1744,7 +2191,7 @@ static void DebugAction_Vars_Select(u8 taskId) ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[3], STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_VARIABLES); ConvertIntToHexStringN(gStringVar2, gTasks[taskId].data[3], STR_CONV_MODE_LEFT_ALIGN, 4); - StringExpandPlaceholders(gStringVar1, sDebugText_Vars_VariableHex); + StringExpandPlaceholders(gStringVar1, sDebugText_FlagsVars_VariableHex); if (VarGetIfExist(gTasks[taskId].data[3]) == 65535) //Current value if 65535 the value hasnt been set gTasks[taskId].data[5] = 0; else @@ -1752,11 +2199,11 @@ static void DebugAction_Vars_Select(u8 taskId) ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].data[5], STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_VARIABLES); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].data[4]]); //Current digit - StringExpandPlaceholders(gStringVar4, sDebugText_Vars_VariableValueSet); + StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_VariableValueSet); AddTextPrinterParameterized(gTasks[taskId].data[2], 1, gStringVar4, 1, 1, 0, NULL); gTasks[taskId].data[6] = gTasks[taskId].data[5]; //New value selector - gTasks[taskId].func = DebugAction_Vars_SetValue; + gTasks[taskId].func = DebugAction_FlagsVars_SetValue; } else if (JOY_NEW(B_BUTTON)) { @@ -1765,7 +2212,7 @@ static void DebugAction_Vars_Select(u8 taskId) return; } } -static void DebugAction_Vars_SetValue(u8 taskId) +static void DebugAction_FlagsVars_SetValue(u8 taskId) { if (JOY_NEW(DPAD_UP)) { @@ -1819,16 +2266,233 @@ static void DebugAction_Vars_SetValue(u8 taskId) ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[3], STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_VARIABLES); ConvertIntToHexStringN(gStringVar2, gTasks[taskId].data[3], STR_CONV_MODE_LEFT_ALIGN, 4); - StringExpandPlaceholders(gStringVar1, sDebugText_Vars_VariableHex); + StringExpandPlaceholders(gStringVar1, sDebugText_FlagsVars_VariableHex); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].data[6], STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_VARIABLES); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].data[4]]); //Current digit - StringExpandPlaceholders(gStringVar4, sDebugText_Vars_VariableValueSet); + StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_VariableValueSet); AddTextPrinterParameterized(gTasks[taskId].data[2], 1, gStringVar4, 1, 1, 0, NULL); } } +static void DebugAction_FlagsVars_PokedexFlags_All(u8 taskId) +{ + u16 i; + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + GetSetPokedexFlag(i + 1, FLAG_SET_CAUGHT); + GetSetPokedexFlag(i + 1, FLAG_SET_SEEN); + } + Debug_DestroyMenu_Full(taskId); + ScriptContext_Enable(); +} +static void DebugAction_FlagsVars_PokedexFlags_Reset(u8 taskId) +{ + int boxId, boxPosition, partyId; + u16 species; + + // Reset Pokedex to emtpy + memset(&gSaveBlock1Ptr->dexCaught, 0, sizeof(gSaveBlock1Ptr->dexCaught)); + memset(&gSaveBlock1Ptr->dexSeen, 0, sizeof(gSaveBlock1Ptr->dexSeen)); + + // Add party Pokemon to Pokedex + for (partyId = 0; partyId < PARTY_SIZE; partyId++) + { + if (GetMonData(&gPlayerParty[partyId], MON_DATA_SANITY_HAS_SPECIES)) + { + species = GetMonData(&gPlayerParty[partyId], MON_DATA_SPECIES); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_CAUGHT); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_SEEN); + } + } + + // Add box Pokemon to Pokedex + for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) + { + for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++) + { + if (GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)) + { + species = GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SPECIES); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_CAUGHT); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_SEEN); + } + } + } + Debug_DestroyMenu_Full(taskId); + ScriptContext_Enable(); +} +static void DebugAction_FlagsVars_SwitchDex(u8 taskId) +{ + if (FlagGet(FLAG_SYS_POKEDEX_GET)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(FLAG_SYS_POKEDEX_GET); +} +static void DebugAction_FlagsVars_SwitchNatDex(u8 taskId) +{ + if (IsNationalPokedexEnabled()) + { + DisableNationalPokedex(); + PlaySE(SE_PC_OFF); + }else{ + EnableNationalPokedex(); + PlaySE(SE_PC_LOGIN); + } +} +static void DebugAction_FlagsVars_SwitchPokeNav(u8 taskId) +{ + if (FlagGet(FLAG_SYS_POKENAV_GET)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(FLAG_SYS_POKENAV_GET); +} +static void DebugAction_FlagsVars_RunningShoes(u8 taskId) +{ + if (FlagGet(FLAG_SYS_B_DASH)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(FLAG_SYS_B_DASH); +} +static void DebugAction_FlagsVars_ToggleFlyFlags(u8 taskId) +{ + // Sound effect + if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER)) + { + PlaySE(SE_PC_OFF); + + FlagClear(FLAG_VISITED_LITTLEROOT_TOWN); + FlagClear(FLAG_VISITED_OLDALE_TOWN); + FlagClear(FLAG_VISITED_DEWFORD_TOWN); + FlagClear(FLAG_VISITED_LAVARIDGE_TOWN); + FlagClear(FLAG_VISITED_FALLARBOR_TOWN); + FlagClear(FLAG_VISITED_VERDANTURF_TOWN); + FlagClear(FLAG_VISITED_PACIFIDLOG_TOWN); + FlagClear(FLAG_VISITED_PETALBURG_CITY); + FlagClear(FLAG_VISITED_SLATEPORT_CITY); + FlagClear(FLAG_VISITED_MAUVILLE_CITY); + FlagClear(FLAG_VISITED_RUSTBORO_CITY); + FlagClear(FLAG_VISITED_FORTREE_CITY); + FlagClear(FLAG_VISITED_LILYCOVE_CITY); + FlagClear(FLAG_VISITED_MOSSDEEP_CITY); + FlagClear(FLAG_VISITED_SOOTOPOLIS_CITY); + FlagClear(FLAG_VISITED_EVER_GRANDE_CITY); + FlagClear(FLAG_LANDMARK_POKEMON_LEAGUE); + FlagClear(FLAG_LANDMARK_BATTLE_FRONTIER); + } + else + { + PlaySE(SE_PC_LOGIN); + + FlagSet(FLAG_VISITED_LITTLEROOT_TOWN); + FlagSet(FLAG_VISITED_OLDALE_TOWN); + FlagSet(FLAG_VISITED_DEWFORD_TOWN); + FlagSet(FLAG_VISITED_LAVARIDGE_TOWN); + FlagSet(FLAG_VISITED_FALLARBOR_TOWN); + FlagSet(FLAG_VISITED_VERDANTURF_TOWN); + FlagSet(FLAG_VISITED_PACIFIDLOG_TOWN); + FlagSet(FLAG_VISITED_PETALBURG_CITY); + FlagSet(FLAG_VISITED_SLATEPORT_CITY); + FlagSet(FLAG_VISITED_MAUVILLE_CITY); + FlagSet(FLAG_VISITED_RUSTBORO_CITY); + FlagSet(FLAG_VISITED_FORTREE_CITY); + FlagSet(FLAG_VISITED_LILYCOVE_CITY); + FlagSet(FLAG_VISITED_MOSSDEEP_CITY); + FlagSet(FLAG_VISITED_SOOTOPOLIS_CITY); + FlagSet(FLAG_VISITED_EVER_GRANDE_CITY); + FlagSet(FLAG_LANDMARK_POKEMON_LEAGUE); + FlagSet(FLAG_LANDMARK_BATTLE_FRONTIER); + } +} +static void DebugAction_FlagsVars_ToggleBadgeFlags(u8 taskId) +{ + // Sound effect + if (FlagGet(FLAG_BADGE08_GET)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(FLAG_BADGE01_GET); + FlagToggle(FLAG_BADGE02_GET); + FlagToggle(FLAG_BADGE03_GET); + FlagToggle(FLAG_BADGE04_GET); + FlagToggle(FLAG_BADGE05_GET); + FlagToggle(FLAG_BADGE06_GET); + FlagToggle(FLAG_BADGE07_GET); + FlagToggle(FLAG_BADGE08_GET); +} +static void DebugAction_FlagsVars_ToggleFrontierPass(u8 taskId) +{ + // Sound effect + if (FlagGet(FLAG_SYS_FRONTIER_PASS)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(FLAG_SYS_FRONTIER_PASS); +} +static void DebugAction_FlagsVars_CollisionOnOff(u8 taskId) +{ +#if OW_FLAG_NO_COLLISION == 0 + Debug_DestroyMenu_Full_Script(taskId, Debug_FlagsNotSetOverworldConfigMessage); +#else + if (FlagGet(OW_FLAG_NO_COLLISION)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(OW_FLAG_NO_COLLISION); +#endif +} +static void DebugAction_FlagsVars_EncounterOnOff(u8 taskId) +{ +#if OW_FLAG_NO_ENCOUNTER == 0 + Debug_DestroyMenu_Full_Script(taskId, Debug_FlagsNotSetOverworldConfigMessage); +#else + if (FlagGet(OW_FLAG_NO_ENCOUNTER)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(OW_FLAG_NO_ENCOUNTER); +#endif +} +static void DebugAction_FlagsVars_TrainerSeeOnOff(u8 taskId) +{ +#if OW_FLAG_NO_TRAINER_SEE == 0 + Debug_DestroyMenu_Full_Script(taskId, Debug_FlagsNotSetOverworldConfigMessage); +#else + if (FlagGet(OW_FLAG_NO_TRAINER_SEE)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(OW_FLAG_NO_TRAINER_SEE); +#endif +} +static void DebugAction_FlagsVars_BagUseOnOff(u8 taskId) +{ +#if B_FLAG_NO_BAG_USE == 0 + Debug_DestroyMenu_Full_Script(taskId, Debug_FlagsNotSetBattleConfigMessage); +#else + if (FlagGet(B_FLAG_NO_BAG_USE)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(B_FLAG_NO_BAG_USE); +#endif +} +static void DebugAction_FlagsVars_CatchingOnOff(u8 taskId) +{ +#if B_FLAG_NO_CATCHING == 0 + Debug_DestroyMenu_Full_Script(taskId, Debug_FlagsNotSetBattleConfigMessage); +#else + if (FlagGet(B_FLAG_NO_CATCHING)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(B_FLAG_NO_CATCHING); +#endif +} // ******************************* // Actions Give @@ -1842,7 +2506,7 @@ static void DebugAction_Give_Item(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -2040,7 +2704,7 @@ static void DebugAction_Give_PokemonSimple(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -2078,7 +2742,7 @@ static void DebugAction_Give_PokemonComplex(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -2226,7 +2890,7 @@ static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId) ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].data[3], STR_CONV_MODE_LEADING_ZEROS, 0); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopyPadded(gStringVar2, sDebugText_Flags_FlagUnset, CHAR_SPACE, 15); + StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); StringExpandPlaceholders(gStringVar4, sDebugText_PokemonShiny); AddTextPrinterParameterized(gTasks[taskId].data[2], 1, gStringVar4, 1, 1, 0, NULL); @@ -2263,9 +2927,9 @@ static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId) } if (gTasks[taskId].data[3] == 1) - StringCopyPadded(gStringVar2, sDebugText_Flags_FlagSet, CHAR_SPACE, 15); + StringCopyPadded(gStringVar2, sDebugText_True, CHAR_SPACE, 15); else - StringCopyPadded(gStringVar2, sDebugText_Flags_FlagUnset, CHAR_SPACE, 15); + StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].data[3], STR_CONV_MODE_LEADING_ZEROS, 0); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); StringExpandPlaceholders(gStringVar4, sDebugText_PokemonShiny); @@ -2796,23 +3460,47 @@ static void DebugAction_Give_DayCareEgg(u8 taskId) TriggerPendingDaycareEgg(); } -static void DebugAction_Give_FillPC(u8 taskId) //Credit: Sierraffinity +// ******************************* +// Actions Fill +static void DebugAction_Fill_PCBoxes_Fast(u8 taskId) //Credit: Sierraffinity { int boxId, boxPosition; u32 personality; struct BoxPokemon boxMon; u16 species = SPECIES_BULBASAUR; + u8 speciesName[POKEMON_NAME_LENGTH + 1]; personality = Random32(); - CreateBoxMon(&boxMon, - species, - 100, - 32, - personality, - 0, - OT_ID_PLAYER_ID, - 0); + CreateBoxMon(&boxMon, species, 100, USE_RANDOM_IVS, FALSE, personality, OT_ID_PLAYER_ID, 0); + + for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) + { + for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++, species++) + { + if (!GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)) + { + StringCopy(speciesName, GetSpeciesName(species)); + SetBoxMonData(&boxMon, MON_DATA_NICKNAME, &speciesName); + SetBoxMonData(&boxMon, MON_DATA_SPECIES, &species); + GiveBoxMonInitialMoveset_Fast(&boxMon); + gPokemonStoragePtr->boxes[boxId][boxPosition] = boxMon; + } + } + } + + // Set flag for user convenience + FlagSet(FLAG_SYS_POKEMON_GET); + Debug_DestroyMenu_Full(taskId); + ScriptContext_Enable(); +} +static void DebugAction_Fill_PCBoxes_Slow(u8 taskId) +{ + int boxId, boxPosition; + u32 personality; + struct BoxPokemon boxMon; + u32 species = SPECIES_BULBASAUR; + bool8 spaceAvailable = FALSE; for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) { @@ -2820,36 +3508,86 @@ static void DebugAction_Give_FillPC(u8 taskId) //Credit: Sierraffinity { if (!GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)) { + if (!spaceAvailable) + PlayBGM(MUS_RG_MYSTERY_GIFT); + CreateBoxMon(&boxMon, species, 100, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); gPokemonStoragePtr->boxes[boxId][boxPosition] = boxMon; - SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SPECIES, &species); - GetSetPokedexFlag(species, FLAG_SET_SEEN); - GetSetPokedexFlag(species, FLAG_SET_CAUGHT); - species++; + species = (species < NUM_SPECIES - 1) ? species + 1 : 1; + spaceAvailable = TRUE; } } } // Set flag for user convenience FlagSet(FLAG_SYS_POKEMON_GET); -} + if (spaceAvailable) + PlayBGM(GetCurrentMapMusic()); -static void DebugAction_Give_CHEAT(u8 taskId) + Debug_DestroyMenu_Full_Script(taskId, Debug_BoxFilledMessage); +} +static void DebugAction_Fill_PCItemStorage(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_CheatStart); -} + u16 itemId; -static void DebugAction_AccessPC(u8 taskId) + for (itemId = 1; itemId < ITEMS_COUNT; itemId++) + { + if (!CheckPCHasItem(itemId, MAX_PC_ITEM_CAPACITY)) + AddPCItem(itemId, MAX_PC_ITEM_CAPACITY); + } +} +static void DebugAction_Fill_PocketItems(u8 taskId) { - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(EventScript_PC); -} + u16 itemId; + for (itemId = 1; itemId < ITEMS_COUNT; itemId++) + { + if (ItemId_GetPocket(itemId) == POCKET_ITEMS && CheckBagHasSpace(itemId, MAX_BAG_ITEM_CAPACITY)) + AddBagItem(itemId, MAX_BAG_ITEM_CAPACITY); + } +} +static void DebugAction_Fill_PocketPokeBalls(u8 taskId) +{ + u16 itemId; + + for (itemId = FIRST_BALL; itemId < LAST_BALL; itemId++) + { + if (CheckBagHasSpace(itemId, MAX_BAG_ITEM_CAPACITY)) + AddBagItem(itemId, MAX_BAG_ITEM_CAPACITY); + } +} +static void DebugAction_Fill_PocketTMHM(u8 taskId) +{ + u16 itemId; + + for (itemId = ITEM_TM01; itemId <= ITEM_HM08; itemId++) + { + if (CheckBagHasSpace(itemId, 1) && ItemIdToBattleMoveId(itemId) != MOVE_NONE) + AddBagItem(itemId, 1); + } +} +static void DebugAction_Fill_PocketBerries(u8 taskId) +{ + u16 itemId; + + for (itemId = FIRST_BERRY_INDEX; itemId < LAST_BERRY_INDEX; itemId++) + { + if (CheckBagHasSpace(itemId, MAX_BERRY_CAPACITY)) + AddBagItem(itemId, MAX_BERRY_CAPACITY); + } +} +static void DebugAction_Fill_PocketKeyItems(u8 taskId) +{ + u16 itemId; + + for (itemId = 1; itemId < ITEMS_COUNT; itemId++) + { + if (ItemId_GetPocket(itemId) == POCKET_KEY_ITEMS && CheckBagHasSpace(itemId, 1)) + AddBagItem(itemId, 1); + } +} // ******************************* -// Sound Scripts +// Actions Sound static const u8 *const sBGMNames[]; static const u8 *const sSENames[]; static void DebugAction_Sound_SE(u8 taskId) @@ -2861,7 +3599,7 @@ static void DebugAction_Sound_SE(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayLargeWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateSound); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -2938,7 +3676,7 @@ static void DebugAction_Sound_MUS(u8 taskId) HideMapNamePopUpWindow(); LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugNumberDisplayLargeWindowTemplate); + windowId = AddWindow(&sDebugMenuWindowTemplateSound); DrawStdWindowFrame(windowId, FALSE); CopyWindowToVram(windowId, 3); @@ -3563,4 +4301,12 @@ SOUND_LIST_SE }; #undef X +// ******************************* +// Actions Other + +static void DebugAction_AccessPC(u8 taskId) +{ + Debug_DestroyMenu_Full_Script(taskId, EventScript_PC); +} + #endif //DEBUG_OVERWORLD_MENU == TRUE diff --git a/src/pokemon.c b/src/pokemon.c index cf2c8f5cc..881eeab8b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4287,6 +4287,40 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) } } +void GiveMonInitialMoveset_Fast(struct Pokemon *mon) +{ + GiveBoxMonInitialMoveset_Fast(&mon->box); +} + +void GiveBoxMonInitialMoveset_Fast(struct BoxPokemon *boxMon) //Credit: AsparagusEduardo +{ + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromBoxMonExp(boxMon); + s32 i, j; + u16 levelMoveCount = 0; + u16 moves[MAX_MON_MOVES] = {0}; + u8 addedMoves = 0; + + for (i = 0; gLevelUpLearnsets[species][i].move != LEVEL_UP_END; i++) + levelMoveCount++; + + for (i = levelMoveCount; (i >= 0 && addedMoves < MAX_MON_MOVES); i--) + { + if (gLevelUpLearnsets[species][i].level > level) + continue; + if (gLevelUpLearnsets[species][i].level == 0) + continue; + + if (moves[addedMoves] != gLevelUpLearnsets[species][i].move) + moves[addedMoves++] = gLevelUpLearnsets[species][i].move; + } + for (i = MAX_MON_MOVES - 1; i >= 0; i--) + { + SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[moves[i]].pp); + } +} + u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) { u32 retVal = MOVE_NONE; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index b01b5bd5d..aa4ffe4ca 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -1113,3 +1113,13 @@ bool8 TryDoDoubleWildBattle(void) #endif return FALSE; } + +bool8 StandardWildEncounter_Debug(void) +{ + u16 headerId = GetCurrentMapWildMonHeaderId(); + if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE) + return FALSE; + + DoStandardWildBattle_Debug(); + return TRUE; +} From b08c8f85fc7803c32cae70048d9eec3adaf91d1f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Tue, 18 Jul 2023 03:22:05 -0400 Subject: [PATCH 053/111] Fixed Utility Umbrella damage calculations (#2835) * Fixed Utility Umbrella holders not receiving regular damage when being hurt by what would've been weakened rain/sun attacks * Fixed reading move incorrectly * Tests: Sun, Rain, Utility Umbrella and Hydro Steam * [STASH] Skeli changes, needs to remake tests * Fixed tests * Removed redundant tests * Removed unused variable * Removed Primal Todo tests --- include/battle_util.h | 1 + src/battle_util.c | 53 ++++++++++++++++++---------- test/hold_effect_utility_umbrella.c | 54 +++++++++++++++++++++++++++++ test/move_effect_hydro_steam.c | 50 ++++++++++++++++++++++++++ test/weather_rain.c | 47 +++++++++++++++++++++++++ test/weather_sunlight.c | 47 +++++++++++++++++++++++++ 6 files changed, 234 insertions(+), 18 deletions(-) create mode 100644 test/hold_effect_utility_umbrella.c create mode 100644 test/move_effect_hydro_steam.c create mode 100644 test/weather_rain.c create mode 100644 test/weather_sunlight.c diff --git a/include/battle_util.h b/include/battle_util.h index aba215c12..15fbe2432 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -210,6 +210,7 @@ void BufferStatChange(u8 battlerId, u8 statId, u8 stringId); bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget); u16 GetUsedHeldItem(u8 battler); bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags); +u32 ApplyWeatherDamageMultiplier(u8 battlerAtk, u16 move, u8 moveType, u32 dmg, u16 holdEffectAtk, u16 holdEffectDef); u32 GetBattlerMoveTargetType(u8 battlerId, u16 move); bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move); bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId); diff --git a/src/battle_util.c b/src/battle_util.c index 9ffb4031b..495f26cd5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9508,6 +9508,8 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move u32 defSide = GET_BATTLER_SIDE(battlerDef); u16 finalModifier = UQ_4_12(1.0); u16 itemDef = gBattleMons[battlerDef].item; + u16 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + u16 holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); // check multiple targets in double battle if (GetMoveTargetCount(move, battlerAtk, battlerDef) >= 2) @@ -9537,28 +9539,15 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move dmg = ApplyModifier(UQ_4_12(0.5), dmg); // check frostbite - if (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && !IS_MOVE_PHYSICAL(move) + if (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && IS_MOVE_SPECIAL(move) #if B_BURN_FACADE_DMG >= GEN_6 && gBattleMoves[move].effect != EFFECT_FACADE #endif && abilityAtk != ABILITY_GUTS) dmg = ApplyModifier(UQ_4_12(0.5), dmg); - // check sunny/rain weather - if (IsBattlerWeatherAffected(battlerAtk, B_WEATHER_RAIN)) - { - if (moveType == TYPE_FIRE) - dmg = ApplyModifier(UQ_4_12(0.5), dmg); - else if (moveType == TYPE_WATER) - dmg = ApplyModifier(UQ_4_12(1.5), dmg); - } - else if (IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN)) - { - if (moveType == TYPE_FIRE || gBattleMoves[move].effect == EFFECT_HYDRO_STEAM) - dmg = ApplyModifier(UQ_4_12(1.5), dmg); - else if (moveType == TYPE_WATER) - dmg = ApplyModifier(UQ_4_12(0.5), dmg); - } + // check weather + dmg = ApplyWeatherDamageMultiplier(battlerAtk, move, moveType, dmg, holdEffectAtk, holdEffectDef); // check stab if (IS_BATTLER_OF_TYPE(battlerAtk, moveType) && move != MOVE_STRUGGLE && move != MOVE_NONE) @@ -9643,7 +9632,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } // attacker's hold effect - switch (GetBattlerHoldEffect(battlerAtk, TRUE)) + switch (holdEffectAtk) { case HOLD_EFFECT_METRONOME: percentBoost = min((gBattleStruct->sameMoveTurns[battlerAtk] * GetBattlerHoldEffectParam(battlerAtk)), 100); @@ -9659,7 +9648,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } // target's hold effect - switch (GetBattlerHoldEffect(battlerDef, TRUE)) + switch (holdEffectDef) { // berries reducing dmg case HOLD_EFFECT_RESIST_BERRY: @@ -10858,6 +10847,34 @@ bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags) return FALSE; } +// Utility Umbrella holders take normal damage from what would be rain- and sun-weakened attacks. +u32 ApplyWeatherDamageMultiplier(u8 battlerAtk, u16 move, u8 moveType, u32 dmg, u16 holdEffectAtk, u16 holdEffectDef) +{ + if (WEATHER_HAS_EFFECT) + { + if (gBattleMoves[move].effect == EFFECT_HYDRO_STEAM && (gBattleWeather & B_WEATHER_SUN) && holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) + dmg = ApplyModifier(UQ_4_12(1.5), dmg); + else if (holdEffectDef != HOLD_EFFECT_UTILITY_UMBRELLA) + { + if (gBattleWeather & B_WEATHER_RAIN) + { + if (moveType == TYPE_FIRE) + dmg = ApplyModifier(UQ_4_12(0.5), dmg); + else if (moveType == TYPE_WATER) + dmg = ApplyModifier(UQ_4_12(1.5), dmg); + } + else if (gBattleWeather & B_WEATHER_SUN) + { + if (moveType == TYPE_FIRE) + dmg = ApplyModifier(UQ_4_12(1.5), dmg); + else if (moveType == TYPE_WATER) + dmg = ApplyModifier(UQ_4_12(0.5), dmg); + } + } + } + return dmg; +} + // Gets move target before redirection effects etc. are applied // Possible return values are defined in battle.h following MOVE_TARGET_SELECTED u32 GetBattlerMoveTargetType(u8 battlerId, u16 move) diff --git a/test/hold_effect_utility_umbrella.c b/test/hold_effect_utility_umbrella.c new file mode 100644 index 000000000..6716ee72f --- /dev/null +++ b/test/hold_effect_utility_umbrella.c @@ -0,0 +1,54 @@ +#include "global.h" +#include "test_battle.h" + +// Please add Utility Umbrella interactions with move, item and ability effects on their respective files. +ASSUMPTIONS +{ + ASSUME(gItems[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + ASSUME(gBattleMoves[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(gBattleMoves[MOVE_WATER_GUN].type == TYPE_WATER); +} + +SINGLE_BATTLE_TEST("Utility Umbrella blocks Sun damage modifiers", s16 damage) +{ + u16 setupMove, attackingMove, heldItem; + PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; attackingMove = MOVE_EMBER; heldItem = ITEM_UTILITY_UMBRELLA; } + PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; attackingMove = MOVE_EMBER; heldItem = ITEM_NONE; } + PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; attackingMove = MOVE_WATER_GUN; heldItem = ITEM_UTILITY_UMBRELLA; } + PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; attackingMove = MOVE_WATER_GUN; heldItem = ITEM_NONE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(heldItem); }; + } WHEN { + TURN { MOVE(opponent, setupMove); } + TURN { MOVE(player, attackingMove); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, attackingMove, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(0.5), results[3].damage); + } +} + +SINGLE_BATTLE_TEST("Utility Umbrella blocks Rain damage modifiers", s16 damage) +{ + u16 setupMove, attackingMove, heldItem; + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; attackingMove = MOVE_EMBER; heldItem = ITEM_UTILITY_UMBRELLA; } + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; attackingMove = MOVE_EMBER; heldItem = ITEM_NONE; } + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; attackingMove = MOVE_WATER_GUN; heldItem = ITEM_UTILITY_UMBRELLA; } + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; attackingMove = MOVE_WATER_GUN; heldItem = ITEM_NONE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(heldItem); }; + } WHEN { + TURN { MOVE(opponent, setupMove); } + TURN { MOVE(player, attackingMove); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, attackingMove, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[3].damage); + } +} diff --git a/test/move_effect_hydro_steam.c b/test/move_effect_hydro_steam.c new file mode 100644 index 000000000..487449159 --- /dev/null +++ b/test/move_effect_hydro_steam.c @@ -0,0 +1,50 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_HYDRO_STEAM].effect == EFFECT_HYDRO_STEAM); +} + +SINGLE_BATTLE_TEST("Hydro Steam deals 1.5x damage under both Sunlight and Rain", s16 damage) +{ + u16 setupMove; + PARAMETRIZE { setupMove = MOVE_CELEBRATE; } + PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; } + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, setupMove); } + TURN { MOVE(player, MOVE_HYDRO_STEAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYDRO_STEAM, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[2].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Hydro Steam is affected by Utility Umbrella", s16 damage) +{ + u32 itemPlayer; + u32 itemOpponent; + PARAMETRIZE { itemPlayer = ITEM_UTILITY_UMBRELLA; itemOpponent = ITEM_NONE; } + PARAMETRIZE { itemPlayer = ITEM_NONE; itemOpponent = ITEM_UTILITY_UMBRELLA; } + PARAMETRIZE { itemPlayer = ITEM_UTILITY_UMBRELLA; itemOpponent = ITEM_UTILITY_UMBRELLA; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(itemPlayer); }; + OPPONENT(SPECIES_WOBBUFFET) {Item(itemOpponent); }; + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); } + TURN { MOVE(player, MOVE_HYDRO_STEAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYDRO_STEAM, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(0.5), results[0].damage); + } +} diff --git a/test/weather_rain.c b/test/weather_rain.c new file mode 100644 index 000000000..b99681495 --- /dev/null +++ b/test/weather_rain.c @@ -0,0 +1,47 @@ +#include "global.h" +#include "test_battle.h" + +// Please add Rain interactions with move, item and ability effects on their respective files. +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(gBattleMoves[MOVE_WATER_GUN].type == TYPE_WATER); +} + +SINGLE_BATTLE_TEST("Rain multiplies the power of Fire-type moves by 0.5x", s16 damage) +{ + u32 setupMove; + PARAMETRIZE { setupMove = MOVE_CELEBRATE; } + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, setupMove); } + TURN { MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.5), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Rain multiplies the power of Water-type moves by 1.5x", s16 damage) +{ + u32 setupMove; + PARAMETRIZE { setupMove = MOVE_CELEBRATE; } + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, setupMove); } + TURN { MOVE(player, MOVE_WATER_GUN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} diff --git a/test/weather_sunlight.c b/test/weather_sunlight.c new file mode 100644 index 000000000..beba0e9b6 --- /dev/null +++ b/test/weather_sunlight.c @@ -0,0 +1,47 @@ +#include "global.h" +#include "test_battle.h" + +// Please add Sunlight interactions with move, item and ability effects on their respective files. +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(gBattleMoves[MOVE_WATER_GUN].type == TYPE_WATER); +} + +SINGLE_BATTLE_TEST("Sunlight multiplies the power of Fire-type moves by 1.5x", s16 damage) +{ + u32 setupMove; + PARAMETRIZE { setupMove = MOVE_CELEBRATE; } + PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, setupMove); } + TURN { MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Sunlight multiplies the power of Water-type moves by 0.5x", s16 damage) +{ + u32 setupMove; + PARAMETRIZE { setupMove = MOVE_CELEBRATE; } + PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, setupMove); } + TURN { MOVE(player, MOVE_WATER_GUN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.5), results[1].damage); + } +} From f4dc5e931f7acf667178f6da84cbd55a0c256ee0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 18 Jul 2023 12:01:25 +0200 Subject: [PATCH 054/111] some more stuff --- include/battle_ai_util.h | 2 ++ src/battle_ai_switch_items.c | 25 +++++++++++++++++-------- src/battle_ai_util.c | 28 ++++++++++++++++++---------- src/data/trainer_parties.h | 34 ++++++++++------------------------ src/data/trainers.h | 2 +- 5 files changed, 48 insertions(+), 43 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 0800e1cfb..fd55a99f7 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -168,6 +168,8 @@ bool32 PartnerMoveIsSameNoTarget(u8 battlerAtkPartner, u16 move, u16 partnerMove bool32 ShouldUseWishAromatherapy(u8 battlerAtk, u8 battlerDef, u16 move); // party logic +struct BattlePokemon *AllocSaveBattleMons(void); +void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons); s32 AI_CalcPartyMonBestMoveDamage(u32 battlerAtk, u32 battlerDef, struct Pokemon *attackerMon, struct Pokemon *targetMon); s32 CountUsablePartyMons(u8 battlerId); bool32 IsPartyFullyHealedExceptBattler(u8 battler); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 2418dbab8..625634af4 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -788,7 +788,7 @@ void AI_TrySwitchOrUseItem(void) // If there are two(or more) mons to choose from, always choose one that has baton pass // as most often it can't do much on its own. -static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, int aliveCount) +static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, int aliveCount, u32 opposingBattler) { int i, j, bits = 0; @@ -796,7 +796,7 @@ static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u { if (invalidMons & gBitTable[i]) continue; - if (IsAiPartyMonOHKOBy(BATTLE_OPPOSITE(gActiveBattler), &party[i])) + if (IsAiPartyMonOHKOBy(opposingBattler, &party[i])) continue; for (j = 0; j < MAX_MON_MOVES; j++) @@ -980,7 +980,7 @@ u8 GetMostSuitableMonToSwitchInto(void) } } - bestMonId = GetBestMonBatonPass(party, firstId, lastId, invalidMons, aliveCount); + bestMonId = GetBestMonBatonPass(party, firstId, lastId, invalidMons, aliveCount, opposingBattler); if (bestMonId != PARTY_SIZE) return bestMonId; @@ -1161,17 +1161,26 @@ static bool32 AI_OpponentCanFaintAiWithMod(u32 healAmount) static bool32 IsAiPartyMonOHKOBy(u32 battlerAtk, struct Pokemon *aiMon) { - struct BattlePokemon *battleMon; + bool32 ret = FALSE; + struct BattlePokemon *savedBattleMons; s32 hp = GetMonData(aiMon, MON_DATA_HP); s32 bestDmg = AI_CalcPartyMonBestMoveDamage(battlerAtk, gActiveBattler, NULL, aiMon); switch (GetNoOfHitsToKO(bestDmg, hp)) { case 1: - return TRUE; - case 2: // TODO: Compare speeds, if AI mon is faster allow 2 turns - return TRUE; + ret = TRUE; + break; + case 2: // if AI mon is faster allow 2 turns + savedBattleMons = AllocSaveBattleMons(); + PokemonToBattleMon(aiMon, &gBattleMons[gActiveBattler]); + if (AI_WhoStrikesFirst(gActiveBattler, battlerAtk, 0) == AI_IS_SLOWER) + ret = TRUE; + else + ret = FALSE; + FreeRestoreBattleMons(savedBattleMons); + break; } - return FALSE; + return ret; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 036e9e4f6..66acaacfb 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3368,16 +3368,27 @@ bool32 ShouldUseWishAromatherapy(u8 battlerAtk, u8 battlerDef, u16 move) return FALSE; } +#define SIZE_G_BATTLE_MONS (sizeof(struct BattlePokemon) * MAX_BATTLERS_COUNT) + +struct BattlePokemon *AllocSaveBattleMons(void) +{ + struct BattlePokemon *savedBattleMons = Alloc(SIZE_G_BATTLE_MONS); + memcpy(savedBattleMons, gBattleMons, SIZE_G_BATTLE_MONS); + return savedBattleMons; +} + +void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons) +{ + memcpy(gBattleMons, savedBattleMons, SIZE_G_BATTLE_MONS); + Free(savedBattleMons); +} + // party logic s32 AI_CalcPartyMonBestMoveDamage(u32 battlerAtk, u32 battlerDef, struct Pokemon *attackerMon, struct Pokemon *targetMon) { - s32 bestDmg, dmg; - u32 i, move; + s32 i, move, bestDmg, dmg; u8 effectiveness; - struct BattlePokemon *battleMons = Alloc(sizeof(struct BattlePokemon) * MAX_BATTLERS_COUNT); - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - battleMons[i] = gBattleMons[i]; + struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); if (attackerMon != NULL) PokemonToBattleMon(attackerMon, &gBattleMons[battlerAtk]); @@ -3399,10 +3410,7 @@ s32 AI_CalcPartyMonBestMoveDamage(u32 battlerAtk, u32 battlerDef, struct Pokemon } } - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - gBattleMons[i] = battleMons[i]; - - Free(battleMons); + FreeRestoreBattleMons(savedBattleMons); return dmg; } diff --git a/src/data/trainer_parties.h b/src/data/trainer_parties.h index a0e45ca0c..1759120b7 100644 --- a/src/data/trainer_parties.h +++ b/src/data/trainer_parties.h @@ -3366,39 +3366,25 @@ static const struct TrainerMonItemCustomMoves sParty_Drake[] = { static const struct TrainerMonItemCustomMoves sParty_Roxanne1[] = { { - .iv = 46, - .lvl = 46, - .species = SPECIES_SKARMORY, + .iv = 100, + .lvl = 12, + .species = SPECIES_GEODUDE, .heldItem = ITEM_NONE, - .moves = {MOVE_SPIKES, MOVE_TOXIC, MOVE_WHIRLWIND, MOVE_ROOST} + .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, MOVE_ROCK_TOMB} }, { .iv = 100, - .lvl = 46, - .species = SPECIES_TROPIUS, + .lvl = 12, + .species = SPECIES_GEODUDE, .heldItem = ITEM_NONE, - .moves = {MOVE_LEAF_TORNADO, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_ROOST} - }, - { - .iv = 47, - .lvl = 47, - .species = SPECIES_HAWLUCHA, - .heldItem = ITEM_ORAN_BERRY, - .moves = {MOVE_SUPERPOWER, MOVE_ACROBATICS, MOVE_U_TURN, MOVE_ROOST} - }, - { - .iv = 47, - .lvl = 47, - .species = SPECIES_MANTINE, - .heldItem = ITEM_ORAN_BERRY, - .moves = {MOVE_CONFUSE_RAY, MOVE_WATER_PULSE, MOVE_AIR_SLASH, MOVE_ROOST} + .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, MOVE_ROCK_TOMB} }, { .iv = 200, - .lvl = 48, - .species = SPECIES_ALTARIA, + .lvl = 15, + .species = SPECIES_NOSEPASS, .heldItem = ITEM_ORAN_BERRY, - .moves = {MOVE_DRAGON_PULSE, MOVE_TOXIC, MOVE_COTTON_GUARD, MOVE_ROOST} + .moves = {MOVE_BLOCK, MOVE_HARDEN, MOVE_TACKLE, MOVE_ROCK_TOMB} } }; diff --git a/src/data/trainers.h b/src/data/trainers.h index 22d4a4880..75f7edc8b 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -3189,7 +3189,7 @@ const struct Trainer gTrainers[] = { .trainerName = _("ROXANNE"), .items = {ITEM_POTION, ITEM_POTION, ITEM_NONE, ITEM_NONE}, .doubleBattle = FALSE, - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY, + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_Roxanne1), }, From 219ac7830c86ca5e1473ac61ec83d10b45d18cd4 Mon Sep 17 00:00:00 2001 From: CyanSMP64 <48017633+CyanSMP64@users.noreply.github.com> Date: Wed, 19 Jul 2023 04:56:15 +1200 Subject: [PATCH 055/111] Update female Alakazam's front sprite design (#3149) --- graphics/pokemon/alakazam/anim_frontf.png | Bin 1143 -> 1270 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/alakazam/anim_frontf.png b/graphics/pokemon/alakazam/anim_frontf.png index 123b8f9304caaba15c3d7230571d0e075aa1bc95..f7de540512fd3eee531e7ed16f20d7016f317526 100644 GIT binary patch delta 1191 zcmV;Y1X%m`2=)n(Bv%J?Nliru=LZrGEH?#pO9B7@02g#cSaefwW^{L9a%BKVOhiyl zM<8}(av(DOV1ZP1_K>z@;j|==^1(6{> ze*ghuOGiWihy@);000CUNklSp5FtHo8Gz(Y(_{l^9Ov1E1PGHW0svP@LjL&OzNY;#oF0Y} z41E?$2Sl>B!ce7L5+-*!V%}jOe+jV3xqK6k0MT zh99Oh!!hU6?A&)Ayh?K5*b)qpX%X$F*)GLZA*NJwFDy!NyvV;kP}?zBe^K0I%p==W z+ok~YqGH;oQ8Z+FLIp>@LlZN(h#TuQiJl2&&8Xgi+_3={+z#q~%3&C2sycN3CJ{2} zVspzN222NKg6YvVlU^3Ew&^1USOKHXI`#mTkO~lm2RnX^1BLKtkZxaPgFm>3-du|s&g*8}|dfAT=6+^AZ(io5>7cQ5yfp{bmGz$#5vR|OCzNly;5WVR|s zmSR?I>B?;6b^*}o?iqop9gw%HdUtE2ZZHn{$eJp5cL;Uzi_83ne8Jj;vAO)V&ed|X z?>QsCyYgQ7ih9s|FDLu3vZqMP6l0T~zXNz@h>$In_0kot3U+qp{RKT6U`1=J03vU+~1l%q# z^85E@fsxxS0;4bulW%_P6&R)8g7D~~E-+eUcnk2^*<~p()brX5Fu0ye?|7*Id-Nd@ zv232R>vZ4Vp1#g7z9DsBs|UIP z>~ro9aU76FNJGBV z%ycI>Rstig%a_XNnVFOVqb^@+K!&Bj@cQHnd#4rXIik0}MI&D-%LN8n9r?1EODQmV zjFdX7Z{a($OT3>!kvC7+x|WM@E3E8!o5vHIHLdn002ovPDHLk FV1gO%AtV3* delta 1066 zcmV+_1l9ZY3HJz)B$0kQe*^+aL_t(o!|j&8Z`(!`$0?M^phe;j1xOnp;8FPlPVc6+ zKq>KsfD;9R0_Z;=4sjR#4c(H_fDn|EQ`G3tcrohD?O;HY!E70={~<^Wp`O%tBrTED z+1`Qx^#O({z7Ox-eedqw*D$_hYqW0zyxRc3+=Zn9m?-_=I$-m%f6)_~F?xQmj;|lf z&Gw7W8a4whP`su%(~Y12(XiSo?rVW>7+5y*D6SuYrr|xFFy`F=u*u{Fg|8WbqN(1b%H2^!w$2xFH88D?0 z^FRUnwfLVh8Tb$?f50W6o7B2!{{4rHLwKf^;TWLD>Rr71XD(&ze0RjWAC9(xRrCE~ zjzskOj3566;9`=z*=S)U7wP#NhzL1zEIAX0f0*>DIQ<#YuX>( z;XxFFWsa=S10knNj8w|j)jskWV)lXM69C@*c<~|b1FTk8e_NFa9>o-A-O%UAyyqw9 zf$?ZnXkq(9M*sn|Uv_3(Bm<^^mP#~MfWzESAmvQCT+T@3S+BcD1M30JG%ik@8A+r8 zSg=gg3I>JDTPhND5)^4J{qiK=mJj$gwoM-Q2i9I!Y%d|Lr};85}VF@I_Dw2u$ZD)r+C>DU7nnW?RUPb&Z#Pfwi9~4RU9?UrI446l5!x2@0YB8SS Date: Tue, 18 Jul 2023 19:28:41 -0400 Subject: [PATCH 056/111] Update msys2 instructions Add pacman -Sy msys2-keyring --- INSTALL.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 9aca02a15..a76d0acc7 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -127,15 +127,16 @@ Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert. 1. Open msys2 at C:\devkitPro\msys2\msys2_shell.bat. -2. Certain packages are required to build pokeemerald. Install these by running the following command: +2. Certain packages are required to build pokeemerald. Install these by running the following two commands: ```bash + pacman -Sy msys2-keyring pacman -S make gcc zlib-devel git ```
Note... - > This command will ask for confirmation, just enter the yes action when prompted. + > The commands will ask for confirmation, just enter the yes action when prompted.
3. Download [libpng](https://sourceforge.net/projects/libpng/files/libpng16/1.6.37/libpng-1.6.37.tar.xz/download). From ca792d43ccb511c110270e4130868505bec5b597 Mon Sep 17 00:00:00 2001 From: Eclipse <115349505+SubzeroEclipse@users.noreply.github.com> Date: Wed, 19 Jul 2023 03:31:22 +0200 Subject: [PATCH 057/111] Gender differences sprites, final part (#3122) * The last survivors * Tweaked Numel, Milotic and Relicanth Updated their sprites according to their current depictions. --------- Co-authored-by: Eduardo Quezada D'Ottone --- graphics/pokemon/abomasnow/anim_frontf.png | Bin 0 -> 1688 bytes graphics/pokemon/bibarel/anim_front.png | Bin 1175 -> 1143 bytes graphics/pokemon/bibarel/anim_frontf.png | Bin 0 -> 1138 bytes graphics/pokemon/bibarel/normal.pal | 2 +- graphics/pokemon/bidoof/anim_frontf.png | Bin 781 -> 741 bytes graphics/pokemon/bidoof/backf.png | Bin 504 -> 466 bytes graphics/pokemon/buizel/backf.png | Bin 0 -> 596 bytes graphics/pokemon/cacturne/anim_frontf.png | Bin 0 -> 1440 bytes graphics/pokemon/camerupt/anim_front.png | Bin 1464 -> 1409 bytes graphics/pokemon/camerupt/anim_frontf.png | Bin 0 -> 1424 bytes graphics/pokemon/camerupt/back.png | Bin 652 -> 602 bytes graphics/pokemon/camerupt/backf.png | Bin 0 -> 652 bytes graphics/pokemon/croagunk/anim_frontf.png | Bin 0 -> 798 bytes graphics/pokemon/croagunk/backf.png | Bin 0 -> 520 bytes graphics/pokemon/finneon/anim_frontf.png | Bin 0 -> 686 bytes graphics/pokemon/finneon/backf.png | Bin 0 -> 647 bytes graphics/pokemon/floatzel/anim_front.png | Bin 1484 -> 1430 bytes graphics/pokemon/floatzel/backf.png | Bin 0 -> 641 bytes graphics/pokemon/gulpin/anim_frontf.png | Bin 0 -> 612 bytes graphics/pokemon/gulpin/backf.png | Bin 0 -> 431 bytes graphics/pokemon/kricketot/anim_front.png | Bin 963 -> 928 bytes graphics/pokemon/kricketot/anim_frontf.png | Bin 974 -> 941 bytes graphics/pokemon/kricketot/backf.png | Bin 562 -> 519 bytes graphics/pokemon/kricketune/backf.png | Bin 759 -> 722 bytes graphics/pokemon/lumineon/anim_frontf.png | Bin 0 -> 1148 bytes graphics/pokemon/lumineon/backf.png | Bin 0 -> 696 bytes graphics/pokemon/luxio/anim_front.png | Bin 1179 -> 1138 bytes graphics/pokemon/luxio/anim_frontf.png | Bin 0 -> 1111 bytes graphics/pokemon/luxio/backf.png | Bin 0 -> 658 bytes graphics/pokemon/luxray/anim_front.png | Bin 1521 -> 1489 bytes graphics/pokemon/luxray/anim_frontf.png | Bin 0 -> 1450 bytes graphics/pokemon/luxray/backf.png | Bin 0 -> 768 bytes graphics/pokemon/luxray/normal.pal | 2 +- graphics/pokemon/milotic/anim_front.png | Bin 1673 -> 1601 bytes graphics/pokemon/milotic/anim_frontf.png | Bin 0 -> 1651 bytes graphics/pokemon/milotic/back.png | Bin 712 -> 696 bytes graphics/pokemon/milotic/backf.png | Bin 0 -> 672 bytes graphics/pokemon/numel/anim_front.png | Bin 794 -> 748 bytes graphics/pokemon/numel/anim_frontf.png | Bin 0 -> 763 bytes graphics/pokemon/numel/back.png | Bin 601 -> 554 bytes graphics/pokemon/numel/backf.png | Bin 0 -> 601 bytes graphics/pokemon/pachirisu/anim_frontf.png | Bin 0 -> 811 bytes graphics/pokemon/relicanth/anim_front.png | Bin 1257 -> 1236 bytes graphics/pokemon/relicanth/anim_frontf.png | Bin 0 -> 1257 bytes graphics/pokemon/relicanth/backf.png | Bin 0 -> 649 bytes graphics/pokemon/roselia/anim_front.png | Bin 1150 -> 1094 bytes graphics/pokemon/roselia/anim_frontf.png | Bin 0 -> 1095 bytes graphics/pokemon/roselia/backf.png | Bin 0 -> 736 bytes graphics/pokemon/roserade/anim_front.png | Bin 1288 -> 1248 bytes graphics/pokemon/roserade/anim_frontf.png | Bin 0 -> 1264 bytes graphics/pokemon/roserade/backf.png | Bin 0 -> 789 bytes graphics/pokemon/shinx/anim_front.png | Bin 906 -> 860 bytes graphics/pokemon/shinx/anim_frontf.png | Bin 901 -> 853 bytes graphics/pokemon/shinx/back.png | Bin 669 -> 633 bytes graphics/pokemon/shinx/backf.png | Bin 666 -> 626 bytes graphics/pokemon/snover/anim_frontf.png | Bin 0 -> 987 bytes graphics/pokemon/snover/backf.png | Bin 0 -> 583 bytes graphics/pokemon/staraptor/anim_frontf.png | Bin 1322 -> 1282 bytes graphics/pokemon/staravia/anim_frontf.png | Bin 1018 -> 978 bytes graphics/pokemon/staravia/backf.png | Bin 707 -> 667 bytes graphics/pokemon/starly/anim_front.png | Bin 926 -> 889 bytes graphics/pokemon/starly/anim_frontf.png | Bin 915 -> 890 bytes graphics/pokemon/starly/back.png | Bin 630 -> 592 bytes graphics/pokemon/starly/backf.png | Bin 629 -> 586 bytes graphics/pokemon/starly/shiny.pal | 4 +- graphics/pokemon/swalot/anim_frontf.png | Bin 0 -> 1108 bytes graphics/pokemon/swalot/backf.png | Bin 0 -> 582 bytes graphics/pokemon/toxicroak/anim_frontf.png | Bin 0 -> 1266 bytes graphics/pokemon/toxicroak/backf.png | Bin 0 -> 622 bytes include/graphics.h | 36 ++++++++++++++++++ src/data/graphics/pokemon.h | 36 ++++++++++++++++++ .../pokemon_graphics/back_pic_coordinates.h | 2 +- src/data/pokemon_graphics/back_pic_table.h | 27 ++++++++----- src/data/pokemon_graphics/front_pic_table.h | 20 +++++++++- 74 files changed, 113 insertions(+), 16 deletions(-) create mode 100644 graphics/pokemon/abomasnow/anim_frontf.png create mode 100644 graphics/pokemon/bibarel/anim_frontf.png create mode 100644 graphics/pokemon/buizel/backf.png create mode 100644 graphics/pokemon/cacturne/anim_frontf.png create mode 100644 graphics/pokemon/camerupt/anim_frontf.png create mode 100644 graphics/pokemon/camerupt/backf.png create mode 100644 graphics/pokemon/croagunk/anim_frontf.png create mode 100644 graphics/pokemon/croagunk/backf.png create mode 100644 graphics/pokemon/finneon/anim_frontf.png create mode 100644 graphics/pokemon/finneon/backf.png create mode 100644 graphics/pokemon/floatzel/backf.png create mode 100644 graphics/pokemon/gulpin/anim_frontf.png create mode 100644 graphics/pokemon/gulpin/backf.png create mode 100644 graphics/pokemon/lumineon/anim_frontf.png create mode 100644 graphics/pokemon/lumineon/backf.png create mode 100644 graphics/pokemon/luxio/anim_frontf.png create mode 100644 graphics/pokemon/luxio/backf.png create mode 100644 graphics/pokemon/luxray/anim_frontf.png create mode 100644 graphics/pokemon/luxray/backf.png create mode 100644 graphics/pokemon/milotic/anim_frontf.png create mode 100644 graphics/pokemon/milotic/backf.png create mode 100644 graphics/pokemon/numel/anim_frontf.png create mode 100644 graphics/pokemon/numel/backf.png create mode 100644 graphics/pokemon/pachirisu/anim_frontf.png create mode 100644 graphics/pokemon/relicanth/anim_frontf.png create mode 100644 graphics/pokemon/relicanth/backf.png create mode 100644 graphics/pokemon/roselia/anim_frontf.png create mode 100644 graphics/pokemon/roselia/backf.png create mode 100644 graphics/pokemon/roserade/anim_frontf.png create mode 100644 graphics/pokemon/roserade/backf.png create mode 100644 graphics/pokemon/snover/anim_frontf.png create mode 100644 graphics/pokemon/snover/backf.png create mode 100644 graphics/pokemon/swalot/anim_frontf.png create mode 100644 graphics/pokemon/swalot/backf.png create mode 100644 graphics/pokemon/toxicroak/anim_frontf.png create mode 100644 graphics/pokemon/toxicroak/backf.png diff --git a/graphics/pokemon/abomasnow/anim_frontf.png b/graphics/pokemon/abomasnow/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..49fdfb706a5f44176f82ccb8870e1c70a90e85de GIT binary patch literal 1688 zcmV;J250$+P)y>Ht%7>8{L+AG_`tppzrw(lLNRDRT{xZpJ7Qb7PT<^5ILGU+>fF;R|}NfBm0dtbNlI2VwLQuv6Fe z!*Rq~h;RE($4L`_Gfsf8|4)xm8YI(@yI#{BKBBU}v;pK&EPI17fH!W0(TMYz=%o#S z(sX>#5!`-9l$TOw4cTpruxVMV++_; zEQd0{8Gv(&{2}D$Nr9zYujP6rSNLmYc{b+S05Uu}PjnH@WV#{%F|KvQcJ=rOAZ;(# zI>xZGT;@{X-&$vy$+!Xbf6?@n@v>UTnbcXPOYCW;&$R=j1<)_9nATaTOKe9@mF7Hn zss_rqyu@&&7WgHlb^)-)_7iatmsbc=ib|SJr90INW&kBl3@|&n)}3}jVqK(CZ>~-@ zLZDqLq02@4x_OMz5?^faX|v*jb?%`ja9&pS=Tv6J)vR-0X8^E@M40_pJpnwiK>u9U z-wLZP7EeaVX&+7F8s#Mu?MZqIja^6`fT2=36QVsvtS{0Az)&Z+;q4&+l=T!$f0SA0 zS1^55<w^Hki z%YgGB+5+4Fba)l6z1Ew{&K&eP=b=69U^ze95HQ?s*a3h;cR>hvzu8QJ_J$t(M%@s2 zV}N}co*>aob9=&ROUlA z@6G|MGGX<6n1}xCSvIa~Jcc0A57PbKj{vXtuYKaRMql*AvSk?0fhPTvVfe?-0h|6! zY3ZjgECi+hV;}2@NU7`sfdeErY_g+4)YLN3Vmms6`+ zN#jwTxWw-x03wk|)c{VDyf`a?oCu7Ad?9tw1z4;lQoGm?Ah4tkI8U5M!4GWmzY+^U zegI$>4LWfirS(24jUE_3K-!t^!n6o*9%XV3h-)hVc{bH&+-Q#VD60p``T-^QvZw*$ zQAM?KiPt9AT+(tJS%A95RjmgmQYzysoBL`_inZAUo0_daG=Psh$xQaoYyBW<7B?!! z7@NhU4>t4W))1D9M#YSRWUDP;#*hprZ+nGjTf@rTwN iUiJs}zd!u9{NW$Cds9yrOsuT{0000 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 diff --git a/graphics/pokemon/bibarel/anim_frontf.png b/graphics/pokemon/bibarel/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..a15a6b5f895fb7772688a6318c894338390a6869 GIT binary patch literal 1138 zcmV-&1daQNP)zi-<{6vriSD&Qfc90LWq@KG5Ic%XT58v$A*UWbgTam=D6jd^hP7V#dS z*3hX+UA&h6L8p#ImLQ4+5V$`o?~amqq)u}8`T>M~ybtf*{rrAAoyTZJ*MD+2A3*5u zPczB`q-@{YJ;8wU=ps9JcN1I)Aw`x8aT&UZE<6?MxP-_Jyu1}cKYM`5)9ZOI^z#Zr zR|zn_eog>A0X%W_0O9pqDQY1L`i_x$0R36{_rJwTOldM=M+pEg@Grzd=-F~qIRHQt z@4*dt916q|i{ENMDP<7}Ap7p^`A`ErQ-h-RlntCM<~Q%~696+SdSrV1XpLi#5}>Hs z0oN^*1}Lo6_W8}tPkam!*Fe>P4RiuOWt{Wgzy_>7x*&Yc$G#*e+Vs#U;+YV>eCrIAgKYhs(}$MG{8QE`lIT@8bqfvESP>1D{dF)o-vac zjv7F09~~3y%#;FYyN3Xpk+vFe1Ixy?cL4EzfNOxY&K~`(qxzDz^7`ymdCn*LOWMj4 z(2U;BB{9&iF~*K7VCRbPD97}_71G;1{{F7)X@c9K;NrBKcLe7!lmuUG)0L2Al^^G z=^wlaoFe*ktS4@uGnkx~=Wlz%67~QdoGzZ<&PPK^hpxjtSpZS>Ccc4w zBG#fu70P-ddX&)ifYr*}1e(HF*@N;<%33^Kz)IF0q}x>1wfb8o#d8Ddb?3hVfy*A) z0^d~k{svff9suG80M_yc+dNO(`DzrEJJ27!cHTA+IvCZ*cKtye@vguRjICJvht#Fm z6bJl6XINrc`v=Djz{-Mc(86-d7Qrm^ut8w#Q92#*1w?f(bnuk=*8l(j07*qoM6N<$ Ef<8A9`~Uy| literal 0 HcmV?d00001 diff --git a/graphics/pokemon/bibarel/normal.pal b/graphics/pokemon/bibarel/normal.pal index 71a5f280a..cc531ec66 100644 --- a/graphics/pokemon/bibarel/normal.pal +++ b/graphics/pokemon/bibarel/normal.pal @@ -10,7 +10,7 @@ JASC-PAL 168 144 120 192 192 176 248 248 248 -56 48 40 +98 82 57 232 64 32 176 24 16 64 56 48 diff --git a/graphics/pokemon/bidoof/anim_frontf.png b/graphics/pokemon/bidoof/anim_frontf.png index c5e7b97c113913e26ec319db63098e4335c83c1a..16f873bc2d815cba1a6a42ab33bb3291914b4205 100644 GIT binary patch delta 707 zcmV;!0zCbV2IU2iE`Jc1U@*XlKwwBP5D*Z^xPbWRxcK<^SU@P~SV+jYfXKkWfPjDi z0000003~?_+W-Ipa7jc#R9M69ma&f0KoEx4Qru@9QbeM_YZ+>1E|(TvLZ3LdIi*DC zeD&!>%nKkv#}(0OOIqH7f-Vnm1rNhaOycv-BuLOuc$$?mzkg@`9Xt9)sW#g9*U6Ef0$Sn5H=OT|jK2VYoAMo{DjgeC zRGydRdVB|?o_{QORg@U(o5~~@-^9iEGYLLC07N@M?B8K*N$~y(J>c6Mn$)*=Ufw$Q zP_8SRf&gv@4&#odj2(P|%3=wA7cUj$H+~( z{rQ9PdEW+X3^?qI^wZ-aNXId*AGp{J#O0voBCZgU zqUNHOpnuokVoxIPQ!e6up;?J07c({ukBbSrtj|S&7bm%xF@eWLSg;liE@BrSISnq7 zz`tgLiwkL#4KAX9jk3W-zCSd%X!v^2%qhv&gIx)& zQ?1|9EshBA(Xc4c=2F-nC{}K!mMBOIVSk_sc0BV%f0) pGqXzCA8LZDKM`ED1aIT-;}^Ae>0qjFkV60f002ovPDHLkV1i)KPTBwf delta 725 zcmV;`0xJFG1&s!fE>{?cSSYxFP;gKn5D*Z!xOn*BsQCE!P(V1~P*9*SFu=gLfPjDi z00000006H%7ytkO32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_uEmBu{aKMUh<@ ze^B7HeALcdE-ku*K5=e?QX+J|`g9`Z1(2ZQis-Z@EpI_Vmj|HWVVH?YeBPM^2^tDd zvr^{w%)ett-ze2a8~++wpUwvfbWi2u9zc8|A3*|;=@b320Q8PE=}ZBJ2@C;7a()8) z;DYH(r7%C891(ONQvtv^WJd(}U>EI8f5;%iLw_4DG| zFhOYIXWQ*oN9aGs0{oAWn{@m0JLU7f4cHiP*q7Azftk|8)+GwMV|0sxy^&vpD!ca$`QO(8r z5TfED9mlwS;9@rrmxG#%xI##Znu}V3UW1E0iM)@wi2H?RC7N8!*fcyYChW347XhB1 z4q)|4whypgs1{eAM(Bz`w>p_!?bF$#7=Asey z2kdd+BKD93#6@&4rzBqwb|thOC4NA7D1U{}ILn z97uvX+gZd?QpG&%?+;b#iYt`Tw?Ed=e%&=7hF53TLz06-m`}ijVOE3IS}6kn{KB)RbC=Y zuK-VH6A?l{n=9-zj#H}5fOAeX?514O@IF`Qh$J#>J=lq8X~&ea)A%f1r(k0RXnJJe zEx?jYu0X`>)o9S?43814*#J|_&eMP_nsB3(VUoFI~W9w?|Xf)<&XX z{lRQSlzr(XQ+2FcT%^werP8PUaF{(na_`gUJpn%rz-_iGx%2?v`R85n a@8cJZXnS`Em{7U^00007xV5CC8#=K*RGu~e;8(}4*EjG_#sA_O6Zw(o#~tg3HOrHVXtsQL(~ zFHp9QWegJ?$wFVGXXl4FkRWyDw#c7+=etX-c8dQ6GLHb-JgWv>qE~~5OH!T0!S!Y( z&@d*QBcOg&l>}k9qVgpUTv7EB1ORUdEzRN>Sc;}uo*@>`C4$BP6YiHjQ%1eT&B`2@ z(2|b!5}4GLFL9BT^a zY>>-f3vd%gS%AowpmEWLyBt{cM#>uSU{KRGyYo%>tqwwh-FXy-q0&dY2tcG)APPIa z52A2oruB2roNxx8_u_q&_7f2Ui$nNh3EXHc+f3s+;~Z$jK-iBAI;r)Ob&AC@T~iQ# zAp7dx;+$A!tH3z3B|xN|2vNsR)&wyZ3A%(N-~vD|>%y2Z&w?t^w*8s_10J-SmAGOI zv(rc`$iO-`3k`#YnlQ80000Xa}Y6l*O6ebT~y^4yYLIVNvOsP%+4M|)B9W9@UcrheJG@!u&M97zB$j~4# z(4kACemKCVp;~a=3@jXix?~FFb0OzGK^aU!Fw!0f0{ExKau@pyfGy06^I;wg>=9 zD7Geq03awv=rX=X6NH|RKl=8^3qr01U=mbnxxKhA$mPov;CWR#&J~$+ZyT?ZDq$jpw%E~4d5CV?R4OJ^vM(K4^)L3 z&CY|Te>{!V0Ee^&*ou|?G+Zxu#c-@_hCcHiGYc2LLDG(}WwoaE-Hp|<4Oti6@3dx4 z!nUuiG3ng~r~sbC3&sUO#i-HxS}k?2bygpA#fQUrzY33!>SseQOIEMz;{{{ipE$@n zvG_?>>(dcq!g81shRXMOm4Wo9Ks-a8ow_U7MBHZxhW;;f?%6$D(Y zo8^+N)|8~G>4-;o1o_3w8XPFNvTCs~8K!ypsZ8^K)^DZ*Ix) zl7$$mi1`9&q67d-md{ucLY85YI~KR2B!}!`bPIr+teKq^0G+1yMxOw1lmP^DdRa~T z!>-}mdds4;fSBJCrp_2>9yXEPzb{;av1|Gk05yfA9z#8RQKp7MwLfPyo+}uj<)0?9 z&{46bA>`2`*~eZH;1nc4>6rl34vP+1A&L_rCCIYyoD!k%U6LhMq`<=Yg30Eq0Dodj z0{mWKju5dO$useba}492z7PP~%`^OxzWY=NvR<%@(*;BTU`Ztv91*9f#3X>{2bXb} z0(1$;_tPD(17ecfCo$i9&XehnHO1J2cryL*{h234{p|b_j@iT>I56|>uY=u}7Z(X&G8wmN zj-oxmz(5iP&-*Et2BvX0@)59o|=#dO&FFhgnDcRW;p!O{12&oyN?WN24-dT^~dv zTv515S&5Efm>_Kk_Dy^^9UjA%Q@P*ongcp=ZOuI!^LS$G`+k34GuD!=1t)#q4@}gj z);uu4q10$)xB{5Hh8zO1Z{C2FaGKyy;Q&aKR^3H)=c`JZRlQF~j>)YeR zfr!^k#?1S(Rk-c%ai^Ey6 z8YAIA#N6#>&!vsiWruY!IIqNfo}Q&Ii8iF;FR}`Ssbn?}?7E02{(^DU?9co~=oiRQ z5M=&hnxA=EU2>=XVwyjOkPNVem1b!dr@&2zGlhQ;MF>p|ISYk<0NW78QBOlnR_q_P zWN%`LWJUhro5U6LG=sB3|A4Hly-NSkPe-$*@DIkmm9$so9}KUP=tJcn3^;r6%19KC uw(6bJDDn@RPUA}nKzi#6;7{F~nIAn}uyIs17Qrs>bBA(mf7Fi)I zk*zO(j#uDlz=rkx`0=Aek-t{!f7eu1l|RSg2DZ9(tBtX$o;JkWhCVc`ZmW$D(#4N9G2OcObi}@aqzjS9RTgY zzyd(+B4ps+SggdE>O?sRbz_Fwmtz^(!9{!cJN6(KjIDP6n{(x?W|Q94af zXRIMNqLd?)RfkwmkA|Us=9^|pWs4}g-iKoVVz_c+Oo})(R*aF_3%Z0Wb9hu`oJL81 z0W3MdQW_w)jIY*35hqa6l2MmNq>>=ZiZM8lq)S?FCBR~uMzV?`eFh_}He!qu2B8!t z@78*+_rM9vD^20fMDwyY%^Q9fc{6f6IvIE93c^>~=6Fu<>~^1VOk%UZn^}L;4UQb4GZGUnZm_bIA+}63x4A5!n&? zy%5QQ{6-KS?~29YQVA$*4so)7e{l#QLr5$DAoxP_c0n*JUfxUc_%OTVPnIt&kz%yF ze0Zz^kB>XCP4Kr~ECO=5BgOWi03gOAakLBrPpoB9-GLM$|0*A6Ka+={xIY*cGS4P|$PD`toGV|jbXfJZC@?AoPZFrf!~;LUcE1a-k6 zLJ#)9?RFEhx?srDUjXZD10%%26Tv8e)%uRf!!te<3<2DU1Kw7=2EpLdWWp~Xzwn1A zg27A7&-Z-6JQ0jmRaW?e-7FZ}&3_Y&0K=xcP>}J6L xr>prxE*PV@A{cdlkb?1?KXAeL><^!Q`v-WCn^VAmIGO+e002ovPDHLkV1mo-UO@l= delta 1326 zcmV+}1=0F}3%CoAUpW8?a7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2LUP!vK^+k z000FWNklzi#6;7{Fzba1;S-k%cdRPQ?vJ12(Mh$4?(Aiu@_cr`9x0lRwAe zCbm0{(!yBNP8;Ga(-@d`M`Ru8%p_0Qk_==D@_Xn=*8LABr$q$RA^j zoMQkQAd>@wL!dpGm=JN{KK$ok9Ibxe&H)pjYx*I8@fZND1Eu2bcZ5twm-4jFJGDyo6M_WN74PUW%%RHcly`U8FG8md0dIVSSmV3$n|YB znl5g_-s@fxI5nWv`w6B%LueGzlrCNeX;cH~Fr6l-J=W1EqLd?)Rd2DN9t}g|%(twR z$`(;}y${C##Bk-toD^|rthh(&Ea(z{uFT4ygCEs;ulK+Sj4MrHW}ERgY7QXei45=+@ZS8NSaPbx<2Ew>mJ!ic#`87VX=6-aXY^zU zf-pl~r3hC?#sDE}MtF!{CPb0BWCj(9=3Og9c7%Q}M6w{C2*TqXu{cJ5R01lSL!9hi z974zd5(@wbzR&Vg1xFuLk z0wToXR7ZUdoE`%#NW%d`Y4Qiy2P|#};7LZ4fS?>O&wYG2&^GRKf6!c{8LmG$090af zL+Sc24SeDDu{FGY>OjPXDen9Bu;*H6-mB?>;>hrbXEFZ^a|^bG)VL5Rx3U+f$sx|o9JxL$eu zmPJUxNJG7ESK<`|$ps^vnpJ`M)<2$6@Yh#f)S6719id3_{nxB271D`)~AB8 z%CZ9BqdpLf)tUo;TLJLPxnRu8^lSJ;TgLY*byNrjoiB>?D*=cqRj&{X8ZP$fB`}jK zr4$VQj6`}4uq~5IVlNoHT+jm%%mJ}$mx95B9_)cP+f5SG1%n7Z*aNrQP0Z?oAy0n+ ztg{W=Ar77hMggqWcT66h@u6S{;7%Oyj_NfC1|KF9egXMqg+DwI3|?Y>zB`4}R|R90 z75?Bf3&wWy-vlH1H^K0p5sXAS!coECKe1O9aUd9wJr@k8SunuqYW|Q5#xSl3M%^Ez kU_9p!TrfWS!>8Z=0ZwzEff+uW7XSbN07*qoM6N<$f&_nHk^lez diff --git a/graphics/pokemon/camerupt/anim_frontf.png b/graphics/pokemon/camerupt/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..b746a2d18721466ee6f30b80f8cbfef7d3941b86 GIT binary patch literal 1424 zcmV;B1#kL^P)zi#6;7{FyfIAn}uyIs17Qrs>bBA(mf7Fi)|O#y00V}ZmqY)u6YHAMMt zD+Gy1AHb(Pf#J14Gu+hS`UG8XGcx8G`jM3NCzjJr#SKRTHmvW*Pai3Y{3*(()-+9% zKgZ%GwmXi}!dTNz8{#d~7?^fPX(5CRs|nCC^tF_(k2%)>_|Vnnz{IqhGIV_(iZEKp zA7hN1V*nZ;lLLc8pgozG5OLu?{O4dCt$yFm0TZ8V`XPYv7yzvUrQ+`7{Gd$YVubOz zKXDDcbLJlaE&uAm)U>ugvDzb*V7qtd((MbiN9DXI!4I# zZ8VxLZo=N{UJ^Jppw;^cra(hz6w;I~UI%GZ1L!cFCa68u(I}#nBa~Hdv7jCeL*vZ1 ztdz#YP>Ow&kKQKZk{4y%p0#|eW_3WFcjdaw7u35+XEVP>Lv*_&n% zUcV6l#KX7ua6O^(vUdib_3b8xA|P?{{$7S8A$n5*@G4a=4)%Z`WN!&1d>HCt@m|h7 zv<06ZDuH(Zh+&KZ8Ta5jtOKzGMBkLpB|NeMpxZ4Ii%R_~`b7W{VQf?a5dfa3@+$qE zeh*nfMhMM;Y<0(A5W^h6_pbm*7)x^ikPU-I_^MJr{DxoQKPbELBmn(sw&g&qc)W-K zyiVAjU;XJZmQPf4yJZ4U9r?;Z`-=Qv<-natF96YW0etKK2tW$YP4+H|Y#0 z$N&-x00_R&yj>8?ikJ72JU+}W`IF^KOQaa?E*~DNz~kdiY!m#g7mI*g?ntqHr~ruj zkvLk0fhX27sqR23k$=^Xv!BVs%sF}_sULTjk2~j?LyG`Fo;}uJ#LDOPzqMAQ8_0+V zwc%K8R1B^M20SYr*0A36%yqk?W5a3r6B~Y-4F#X;0Qh#J9Vp!~9P7x@&$uO6O#&js z;#5a{4xAnXEJ(uvLuv8{*as|b2jEFYlYpQcFwcE_IM6okbAQlWq#3S1IRI2*azp9* zFAaR*_OUg*e(FHPhAHm*_ORz#Xx^*of#S5zeB^e0>hrbXEFZ^a|^bG)VL5Rx3U+f$sx|o9JxL$eumPJUx zNJG7ESK<`|$ps^vnpJ`M)<2$6@Yh#f)S6719id3_{nxB271D`)~AB8%CZ9B zqdpLf)tUoa0r1PYV9d+(YxqQ4#`i0AR0sy0FN*Xl0f;J9uMi9xF81jqFq12#6b$~1 zM0yUeEt5-PFBrUB&;t?70kLbBg299y?14AiO%l`vg9ts?1Gn2v%<6(6Pk#ZdvklxK z4xR``0j$<{Odg)`pNN-kA0`ui0r`bLJP{0DVt&3mh0|9BW0e*D;4}-y zcJto^Bl$PM@SYKjL^{Gz!Qel!R~B&~7?3>|45wKz!0BrKkPF5zt_VimAEaPB=MP*k eKKsL`-~ItkbD)74KAaZ-0000CqUFEWXm2%CO{yZqLqjpu=M;<0)NU8A{Lng_|kj*G4yAd z>w(2$^#>s4A;b4Qi^Vg5IbY7G83H-yVd#MQ!U4$?umj@JJV@q&D2k*cHP|D7YXdlo zL=Xx*kqxcmfkBsjAzvhW*#oTt2EylO9grNbUzVG{CKyl|Pm zSLu7}SAE9o8-I$6mFptmXC3}N}?W^skUCDZ#$`U zEn9*E0oa_UsC3=%^@_7}{T*+qS9uBWe5I658zz~2qn6GA0IRA8Y5=O%lH|p6Qh0EL z-&vqjbfd0Q4WR10gVimdwL)fR&x7s)NU(cQdu{=3YJM6as%eX&xB}hCKben)?5O=7 zpwEPzIoOLi=+Xi+WGQ`HYmT%v#;EeA1IB{2r|n^9)F!zP98Y_~G9Q~5!!Cy24&gh4 za!{7Z7dY%ux^=-AqU{tw>*k2}bOrDO4FMFN_G93o|3|+8oM|}h!vmc;00000NkvXX Hu0mjflNIxd delta 568 zcmV-80>}N@1dIicUw;4za7bBm000id000id0mpBsWB>pF2XskIMF-~w2LUP((HqKc z0005+Nkl?81aU4f z$u0ZYCNueafU5I^g5dr9@nS?2ebs+i66MZJN^!TZP%Mg`rhhn>xBYKw%2=Yl2f$}H zAVD8u62%^*Hy{oP)7c}yl&^TMk_QP`ju4d(;ARN!XAml%dLU=f_@X~b5-y}nm0Fy@ z%dZO{CFcN%nmaJL2bkN+g~}HJjHo>a1rh?7_6+q0tiN>R@M7FM z&}+J=zSk{KJv_nHB``)Kvv==pF2XskIMF-~w2LUP((HqKc0005+Nkl?81aU4f$u0ZYCNueafU5I^g5dr9 z@nS?2ebs+i66MZJN^!TZP%Mg`rZ|_k{cmc@SfaiMz-KogK_6lg#U7+LAPx!B*(1P| zuXwJK2MJh?5S0($W(e+Q5GtQ~AZO9|qCZL!E~HGATAaYkuL~e0=KzVCJ21HinA^&Q z$`=8Qs67V-5(1dy9;6RIJYngCsj^Hf(r3?LYycuwj4NCfIrSgl&yzyigH$4ZivPot z>Jyk)Ng>>N{sW+pnXHAZyHme5JOIH{E)(@Eo9wO5-nwxeGG1P>xSabbQkfN1Myqv) zqtRi*t9F^CXbBIRqIo9MQC~Gg0gQCFT4HXu*V(e^2ptr_de}v6R;^slrO1{)ahF0> zr+{dzwKiER8qvH`M?(N$T?eoN&@0nWbL#ohxbR}!JJ4&osJ_=NP(3`s)g>@SBeQq! zgYE((xMxr|jDRr>T@l@OWm$fJ{;Gep?=88l9tS|530u2&KXz{_2S&)!=5nn)(8gM; ztKS}67g{^o?6+30)BE6X+z}4@zD}^&<#}(5@U6viC})ZsFZ(Lpbzv;g<`!Udd%%7A m0Qi8;0Tv&3*Wj!Eo%#!)Qa=_Lfo%Z*0000v5wO~5I}t^k@BQn3>AgFv3)uT(Kvj7!zxl*lMOAg>;bNzK!W=Nz93NK z10r4c1G>A~LAn#AeFZh=Z(w#Ent0cJq)ZV-nx~zyXV?22=NN|=C)9B$_w2yq5v4+m ztpthVSYV88zz~6vB5X@Mc^$_u^U2J%#G^9=CSTv@BJnK1EEbbbm$|LRo6lH&a;X4w zjWel$cVF`9(p)3T-9!igvAQzX2t*sxA3vAI8oprMRqx3L4A}GPj*Id6X0tTbAc9ua zH49V^<|cfRP*r2Pv;gFPn0fXFqEgDfIY@eo+% z6~POgFK;Ye`WdO4rmo6AW`Iye9_qR-n=&vC6cR@65opS-u?c)p-s$$f`CFE^;j9Zl zA%z!ICB`k2@@*$CrA)m*)aCZKJI4R}!+1K9K~h{Z2<0^*7cz@iVl z6%dGQ4ugJy06=B~z|#iu(P9UV4<1qZsx&JK`h}wnq-;!f;6RWdpbVtBG1$QXI1f}1!HTpgVndxQ$tsR(Y1qt)OO(P1fy#Q1FaYMAgy3@?EnFN5$*)T zUjMa5 z${=Kv(gF5>F5Hz8o+ZFn4d93ly*tzu({Xc;z5yUhaUg;pm=V+-DG5c;U>uA9;pIIJ zMNr`30En+~D5I*!c_^c**;5#_XU{kc77ic{u)v`q6qttroY_-=CLrM{VH+O+$cfP6 zs!ZS?pxrSb4S?yBg9={gCyafQp)#QAY?D_ljwd$rcD6&nXKxyoF!(?jM<$u z#1t|c0EnbC1@eGZs_M298Dqpg$lhk6TkEuZaGvnY2B*9A*OPLI2I$oZR{AGXzzoqf zGj62Jmx(A+#&QjS7U=K%32gyof9nB@gNMTa0000< KMNUMnLSTa9Q0MUg literal 0 HcmV?d00001 diff --git a/graphics/pokemon/finneon/anim_frontf.png b/graphics/pokemon/finneon/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..26a385af4634839be096b5a9e0639918fbd64319 GIT binary patch literal 686 zcmV;f0#W^mP)F>BjE6vq_~kAcK)#|(OQKrR@>U2Eu>E{Q&XFr-VTBCJeZ)!kDyRzuOz zIg3n|8WZ9}AE29?LLr2Fm)^-V)4ivuP>SB5<^A-3&wfvLf6wdUpN->|`~e)92SG6i zJ?~j`gaUov2t-kg0z8e40N}thjSoiPqxoK%#q10K?V)#>#T@b_0eoEWKovd#BrsMb z4dhCl;!U;#9F!_izTrHgd3!54o0;GbxGK`pV06>5ZlUI7JP2OFh+Q@37 zwE^72WUGzT2Dte)E{ASlUFmlQ;A7<+mH}1`urR}NPE&4e1p~~HaZ70hbhco~M$H-l z19-wI!1O*cYz}N&+5Al^LIkL)l>u&({<#~NRgJ=zK16Pb+13aM@flFSyuSV}`~e>k z!2KLzCXgmApyv2CT0p%bK3n!xs{&4m!{xQf`!NL+@SMtfy^D+P4DX_gzZHi&K?A=M z1jU4E;XNOhByh}g1v~0T*qfOK%-!Cm&;pFx zN(5w+-cNuM0UG~c0YLr-d2RiJ;5bk-dENL2q(W88s1MA94&Z{^7y; zhkO}&n18T95)|%*F#f@|KmgJT=q%w&>}IVSd+l+!;th337pgZfupzolYbbs z_y>V}-GBVU3AQPF|8R$I)80SaO=$n{hFHhFf0(rShaK%7PIlzk^7z=D@&9@J24zYU U&7-B16aWAK07*qoM6N<$f}^Q5+W-In literal 0 HcmV?d00001 diff --git a/graphics/pokemon/finneon/backf.png b/graphics/pokemon/finneon/backf.png new file mode 100644 index 0000000000000000000000000000000000000000..2e05aecb68cf1f51d2fb4579c0e90947c64836b0 GIT binary patch literal 647 zcmV;20(kw2P)B*66vtgU3t|o&I(YCKOga<{f*eiocR71dxj{>Zh`?p(*0sZ>8Zvcr zC=_mL?n^i}q!doyrBAZmlSH%MK_6Hkzn}i^=}AvP@M-^}?W5zqFbo1xrlVv2lMP)027iJ7{MQK9FJv zlLVo=>ZzSScsT%v$$gh)OLvbg-P$o4nEaf=t-MJ(fYO#$E^sRwkn*m}(g1drB$`Os z;CG*9y+liAwFR*6a#Nm5DM9~LDsOX29pFlCpa+P;2)UwmDG3wH9*Buf5lwl(x&v-5 zdOxL^r?4`>-NoRaZ(Tt6z^r=u2)O2}Ax8D+16T*KU}K?riC-QNrBWbJh~>H$u?jI2 zLNuk&04vU*h(p=|hS(^2`6G9MJ;Q-%D?&_Hz5cO)Q=LQyL>dXt#iPuT~O!{CP004qz;PS%>y{qL-VcY%snuS9mamE0qK2X0kgMy&MDa zK16}{xUi2a8ZVemBo8~FNua200o)>waF?|*5*(7Wbs7V!h|r>_iBeM(fJ8Z+6=9VT zT5vo#j!fx21$b)(A7dfE;C^b;iiHbc;20yY`n}t0?|ovi!W`rGR!cMQjX`0AvcL0> h9wJqLKK1{!y#WcI59z3{Ihg6Lq_EaZ6%V+4DS<9Z4 zcI85QD4m1BJ3qbm=FOY;{+9LcFZZT>$gSMB!CMK~>t21O{eN{}d4H9E@Tx2uuzLVy zw!+1Br_zCZHn4_(Pr2Obc>Ulp2}z%BypV>e$N zjnfb6UrvXcKWp86-e?U{LvH7WoMvnp#`|kALY5A**2&nZT{7;+@M7#vx<% zSu~xRF-|{H9u+W99vJuA`qLFKoB0Zuhfv5-VrFNCi-`Vl<}nUgRsAN4ez_*-L{6Lq z9b;9UJenrU=0F=zX^H^~A_0&CGGG9dT)HyX1YTSLs{V@Y$ajqkYmFvo0X?0y2AGCIXFA;X-DmEF~+EBnYX#nLYP_?dS3%e4OxGTS6%;E>LCHEbFQ(vs|tU)%c(Ko zaBaN6Q@S9Jt#VzFXzVOP$w(Jg?fIg#D$hOD*=0*9@VNKx1Z9pTM^`% z>J8=lKV%y~=qYiLMXZs)LD;HG`7BGn!0`jvWThUdGKom6h%Lwq9T8wfbKS`vyz?>hJhGx6oBD(AA~satvw+OaiBF$3_Ne2e-PxN zA)Y9`X98cSQ{sRm*O~Uv=hw5{(Q@Vf93Xk*G#Y(#__xnZ;P)JLd~s~5hxVCP&6hx^ zf$fC6P_~LnU_2g9r@U%YW$pGbnSXM71LM!s2j;SfS7=m*lX(JZ~8Q z)rDwPWl&fe-cIdGVQjHd5H17k;#z{J>7F7FcCI8yJ)a^Ew8GfY2DE_iQ$h4Ym2-BX zBnYKCt)m94;PY5~WatOwm*-j4&(aUtFL(2q`hovF{lNd1`r$91TP&j;H$4LY0000< KMNUMnLSTY@Vtt|j delta 1406 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 Z`~cVO0Z0v7I|2Xz002ovPDHLkV1lb&w}Sux literal 0 HcmV?d00001 diff --git a/graphics/pokemon/kricketot/anim_front.png b/graphics/pokemon/kricketot/anim_front.png index 1b23ff111a981f4177f16efd0f3c97ad71f54dbb..e9a485ef0c91643c4fc3998dea56b75c9b186d8c 100644 GIT binary patch delta 846 zcmV-U1F`(W2cQR#Uw;EDNkll&X5XX&Vl%+$T>qJ#M*|iwh0$;$ko*Y9M zhy*l^I>L*@)Bz{Vccu@V54cqrpmpo;Zs=LR|wnvTndiost;S0j+8}UHyn& z!1jY4B;oxk)_=wg@qslvBOxaIw21*dF=j3C=|&8?AE#&lac*wCx%>7v==QM)p%BC- zt-IMZ|&;q~Uu-fdJzn924=ukb}CdN89!xt(5Qox1y(wA6`32;s~86#5S05m{c zwAkL>RlD|1!@oi_SS^Zz+7P|3Ar}{nX0gLEMN2_smP^bisILyO3Su zoA2PeK5GScZDL>y Y1Ey3gbZayibpQYW07*qoM6N<$f{twJg@3@dPL3fAL;{*d9pNG|b%+um zQzcR#QI<$V;-oCGXj)y@Y;?AYHe1q7+u>pn_JtTfzmZdDhv8trt`K5-R=x5J3|M2V z0zfU9d&KnZyMKkQwOD1?7iWn_sB0is)(cqWpd!X}Nb8zT?-tPy*ly5=Abe2A+PEf8 zSo>fk#Du?_VnAPvSx1OuH0+(W(F4S}x$)}q)32a6z<^K)Vw2A0?1u6^EC*Vnw9DIbCOrNPmd~&;W7KVLLlgHr{A>6{5u& zaU3)v^m`1sxL~YUj48(fo%3VXEf)98rwSnC$1;xNJ%gYrXkHj4w*X9S2L*IuMoCgE z76H%{z*YkGtw$BFpSl_a;0GUOyj)s4;zKv{ZBv@**Wm4&nE}CXr`5u)HU|2_HxWa0tNIOaU|p zou%4i+~&NB16uI$b~cZ;_)yh{VE;EL2OdF$F@6`&hcNZaiVEn^tt0SLArvtfgEqgX zBQ?;j$}6)6&BAy0A*(u!SgG7YlgNeDLLu-=DS+-?Vtp?Z8jBMqDBzcZLZLOKsn$aQ z&uU5mCQ_~E;#>PP1xA8%9MJTWPA6tP8Y=Zc_%)7S(~=Xamh=1!^aVU`s(KiYLIA#C zg8N?wn3PhG)G7ePhnuP)We9VrE$C|0KaBkWA3!Tp*+l}j00000NkvXX Hu0mjfFzc6d diff --git a/graphics/pokemon/kricketot/anim_frontf.png b/graphics/pokemon/kricketot/anim_frontf.png index 6cc750f273bfea9ae12a100aa5ae8887d3739128..ef0ca6d8797d8203d8f04342208d08006b8c74f8 100644 GIT binary patch delta 911 zcmV;A191G#2dxK?EPqf)KzMLqn3#|d5D9rzSReqfNI2kVVBo-LkWd(CKp+4B z0000000017!lNtz00THlL_t(o!|j(bZ_`i^#~sO07luA#Dg=`sR)%aOU%<8=t`j=6 zQfi=Lbgoh+hN`6PgcQhY)umF9`Xm;tw4le@tt_Adh5AErZhyP=o;xuh<(3Th)7`y$ zes}*^*3AB6W9%0HqgEwh^LCrhR|1~Hy-L9GDuLCA`&GayWTC@@3O_)`-OJNZmDbS@ zk)L7&yZx8|(klR_mKC*I0S!Eh7C;A9#ED95^bggFhfe|PN=+V~=p%vcAc5yf zsi&vikD=r6n}5I@KnH=P;w)rt#Bbi&Tne4hmf9~uCIW}JvSAFJjgFd#k(gSxxOvL0 z7@o&lm_%+)sXouCw~%e@Ds?FLG78vI6X>fC=V~;3Hzfn819#!Y#h2glaGQ#dD8)GI zU!0x@xwcFI*n+6#L+|uNzR|=**;qY(O#mC`;|C@HQ-1*TKW%HO#u7LX_W+pIG=L3I z@B6T_ay;n0vglK&6nc3c_r~N0n@IH@pxMlYqybyX9T+s5YwmpmkjNdK=lPn$$P%nD z85e&Lm~x*4Z03%OqSj^%UiY5T?4@~#LpKvT>}q{XE^aH$*we3qEn_w)L@ICMDEhcj*il+t?7H zj{0U)F1|5F2uNTBm-pfDP;P4ju!+FLEdlZrHf-z{=aWpzE)7`m=Rc=s<3%~5Ga#^z z(n88HW|+`-fqh6yzwVfTzF2&XexZ~h2S9mIV%H30UH#D=VzcPoy$M|(m{-a@vWQyJ zZGSZ4s8s^w?q%N3Mx%Eb;gAHPR@`W$Q&DO?5(vE#099(efZp1BC9tccqyfu*+wbQv z6p2wEB;WJ=rD*wyX*r+mqrSlBEleZiPJ+NU&oOUzd#NZ!jQK`?=n5fFQkwu2ALaiB lW=!E;X$vtM_5a5H0v+W#O&p$<_y7O^00>D%PDHLkV1jHAx0L_@ delta 944 zcmV;h15f;|2hInOEPp^iNN8wqh>(~N5D<8HIQZzWSReqfKq%mFSlGCDm{2HyFc<&; z000000001EBcDeA000SaNLh0L04^f{04^f|c%?sf00007bV*G`2j>O{1seek_;q9e z00S{eL_t(o!|j*9Z_`i^#~sO07luA#Dg=`sR)%aO|A1{hTz@C+&`PN(6{B;NIx$p` zmI)~(FBJ(=0^N_p>rv8hCAv_5i$`t#FY(V=xle?L=45$vc>f(cVbwNcQA?E&8R-ksXfTH z$4VW_*Ha4EQ4{DZRg8y&{frEt-nt7-K9>EHeQE`F5l=~!LGj~)J&1Mq; z%K$7EXn$V^!tnYFsK|bLR9)KeEV)CAb88G9&$IOnAyx`_HXou zQ9INwcUZ0M8Hn1|5_4K6ZE(ANIlFKp)8e4kW`6)iD;Vb?cS?utUHx7MIFACWzSctl zGf!(9p9l36<%bZa(Ze61e8_x#vSJv3UX1b~^nbOH2p0ghLKhd(3F)tgZYFft)%qQ| zm#s8oOP>T=#0Xntjudc|hpyVy@AL{Op|-}$=eXELh6r`kH^XxAjW9w$0;{;Z4+n>G zR~vxm2u$1(Agi#U)E<*e$}SC9@rR4E^Uybd{l>n$x>jm`I-Y`&=m;*5OoB*I6aDY6|lN9E?0Dw}Qf`14br3X0__*~j>f`E&t zM!l4Kt#vOOF$&15)I-=L1PYG8a<6^ZBmja(J&>)w3E8|rNkmjZMhSSL+b z@C88}EVv-R1Al;bo1#Ihz6CDDBvHHZ1y3HVJSbyOc~D(} c_)GtUKjY#se%|Z1uK)l507*qoM6N<$f=n{N%K!iX delta 477 zcmV<30V4i~1hNE>Uw;4za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2L&4=*qAhc z0004%Nkl{Xjh9qh!y0ibA2I^w2}#g2@~dQ!TLK|=v; zk$_&8a}lsbJAVJg~F^e6lVjVC1h TMb3|300000NkvXXu0mjfv8Kpl diff --git a/graphics/pokemon/kricketune/backf.png b/graphics/pokemon/kricketune/backf.png index 4f7f225d2b747dc4fa13db16d3c7c2e66494af47..b07e1451b97529d39c50d64aacd23339c9dcc770 100644 GIT binary patch delta 638 zcmV-^0)hSa1=0nOUw;B!Nkl?kn#JI>2Xr6Zg)(BaY_`m@U`z2IL*G{R1J%10><=0M|NnY;@kN{B7 zb-p8TL|x{@HE76p1Uj++CDdDiio6N%&^!k)jOq^C=Gi9M@&gdMa`{B3}VK-2W^9O}BE%RcrxG z{7iw#LIjLu3V%!!76B#!_y({hsdKV$ucGc%T*hqS4uDR9dB~SW;cdhKU*3YnM41B1 zkS{sDogM&AqDFz+Nz1KA1YXbuj%5G(CkDbJ&6(=02Km7#W_N(%Q$KpZ{peqZHINB$ zv3KA)N;79>{vm6`$KF~V0A@$ojL9qf1kJIxFK`FMbAJNxb`WPfVwwK$&PXA~WF+bg z;ESFBrYo5)A_^@T;0*YYIWbyP@@uk)I1b2gwz{=vC`}`TQ6||l98M&=Sbec}z%-R1 zip2oFQYV5zjg?-p5;d=a$Ro)t7U6)w$MNn}oS}6BV{7qDT~2@jS`@(UIN%yqSPaks zaul#S0C#>DFdhNeqbIun_InkkD*-NV0vu`wj1T~ygMmyuS`V}V__YPRg$`UF5V&EE z4&t#57G}WyaBDjPvdIEnfZu5wwg8$)0dGN3n9I1SRi6TY<=%m~h^+P(;kQ`72mIgj Y7mF>Hq)$07*qoM6N<$f_HBs8~^|S delta 676 zcmV;V0$csk1@{GzUw;4za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2L&DzgEsJK z00077NklPaN_$;sT&@@#gpjA%6;hjxp{3?;Qg!BoILD z#!HGrPC)ax3y20(QPPJ*JnWZHb-H#+HST%fF28o#LdkkxfCYe~uJav%Bk2k!u2EyY zBXD91P-49msMx!J49#tBx(}4 z{n2Xck+J@nT+m4NuL%%7IlW42HL6dh6ZUBf6rU%+OMkr%YajzS_jkaK%FLOC|HvB1 z36KF01T0ZmWF+bg@vEKyp(~XxB91K^@PhQG za%MDC>RYmiBn`-LvAVSvEKLJoI+N@fiD#Bwt-e}2P@2lHPQ(B`sWYRXrb=I^l5SoF zkw=zUDu2QOgOAhQcX5W+35>0!Gj%xu25d=yy5oSCu)<=1515mH)dBFkK*$K79zECv zus^CWT?ue~7m!#xV8j6U90FD1(R!c_z^^UfEu7Hxfq)z3IAJ`t!NLsKC%3jEAe$`k z1^At|VGEFn6z~>0j&m8eZq=s%P`P&?E+VV_MIHDp*6#ryd;S7K0nPRS>a+U*0000< KMNUMnLSTZPT`Rc& diff --git a/graphics/pokemon/lumineon/anim_frontf.png b/graphics/pokemon/lumineon/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..ac511018d4a8244061f2bae3ff43728925d191b2 GIT binary patch literal 1148 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 R-0=Va002ovPDHLkV1i5|{Yd}- diff --git a/graphics/pokemon/luxio/anim_frontf.png b/graphics/pokemon/luxio/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..30ec79e6cd8b3169936e8125d42983704ad0f525 GIT binary patch literal 1111 zcmV-d1gQIoP)l*O6vr9h2xyEn1V}rXDmr*`qz0%a);`h^yBIC+1abB8sU|wgBD#4< zP*>eusRQK1y;Sktb;=Iu!5?g2eaZ{~jOj?)_yL_v2rU z`YxbxumgBt)$0$p1D3TFXjs-~I|Q2cHh|D(dq?UTwib4{ZiRsgm}(>36-_~@;P z@>PJ$F7RWp2AHt&vnyW}K)4+^9t?^sYU3(Eq?8wA5XYkvqxMrVT?GL7yf;E%h+^`h zk|eom3cNp#2Lp;?iyCvW0$f|Xh>u{@MKQaQBe`xukpaMW<7w-$ZJro}!|KcOzW4zK z7zd$F5#Tm)K&(Eq_ef$C&ZY?LNe8II{I$1T>vxN|lp=ewcgum6;s)ve1`x?r(v5ds|I*oDv)<<;i9L6#}SfX73C(4m@j?iFzenG3*t-A(|; zKsbXT=Ai{lmlwAdLZKe;@%bIbRHPVVnr#>OocoILD9Riyz&UkMKIN%TLY`D-umbfQ z3#HP)CQ4O-{>%Mailq`NNNO5@Te6j4F{t6m8O~JB!OU;=e_dQWw7&GlFUmky&N}pN z549+*RJxn1<+Y>z)PH8gsDX0O(=M4fS#Je6fdHF6br95zbw^G>#n5OYj01 zOPkod3|wB!1xCJ6lX6n(yz|2g4Fc=MG1%i=2Vm2;NzuMzG0vh%*`myWNiUvvc<=Ne z(E{>#0f-F%+yU_I0$6Ws-K$pg;~W5(E0mM0UA3Mj7({{Syo0fFDap9;Gyz$-gvbkQ zgI4;Mcl~*K=E^Dd-4DJ^t6hnxN7>o$uFT-{0~d~_@lnO|w+G!B{DE!H@ihyEf_&G= z<(t3K!BBf3Gss_er2IvtJ*V1I&?3appXG9j7C=xC)kYA`Cy{(2l`z>9CQfb7QhUB1U!|68-ReJKjDE&eXYYV zOdbYF=&LB)00fY!L^wgp9F2b{9E3u9;zmqSoqsS)bPx(1grBNsTHqUW5Y(VPF5jf; zA8-xJo6h1N#bI+&^$&$@n6>TYx3=bGlbKw~l1@wa--O)WIgAYk!uUtEyTd>jI}HT6 dHxU2P_!|LNl^beG#>@Z!002ovPDHLkV1me+69E7K literal 0 HcmV?d00001 diff --git a/graphics/pokemon/luxio/backf.png b/graphics/pokemon/luxio/backf.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b5e4bb9a3b3fbc6628ccd1fe581e27e5b9b4ce GIT binary patch literal 658 zcmV;D0&V??P)PeIWKn+=6rODX{jVd!skn zBi7EjJ_R=3yWc`I);9RvFM+}bU}vmF&EKgH2F6}mYr6nU{^A_?N1*c-$wLO95Ik6W z1AGP;(B3>`0cnDL2FACv3||?g>DBG%a=`t(*yP?qUx~mlT>Gd0<6ZN+l=2 zX8ZKqNd*KY2F#&ehn&)K=B0X s&r1(soj!yh@3%qmPGF$?m;PV>0Pw!0xA^Rc*8l(j07*qoM6N<$g6B3MI{*Lx literal 0 HcmV?d00001 diff --git a/graphics/pokemon/luxray/anim_front.png b/graphics/pokemon/luxray/anim_front.png index 989470b19b26fc0a3b201c6f4a0db9b70d0cfecc..b2de7e12e63c66a151db25040992c27e45e9ab3a 100644 GIT binary patch delta 1424 zcmV;B1#kNC3(*UZQ-A;e{{R303eaCU000GCNklZ^0ZGm|;UgRtnV*s$k*c2A znVt{e5=B|@x&3T)b#+a>ZxH-{Un`Fu0M;G=RtCKNmhhJ!uYYxb@Tl?m!9X;LumJ>X zgTX7~#|-uq0c`oHmE+kgn)t+ClHj7M!miJR&@l3V2?C*wD`1N8B2%X@CqP3DP%H*j z#BeeJ&Y%XE`x!NWIP!qvRqqi_60pz#!Wu{tzyP)%P2W%l%;Dg8u(8}hF>SnT zGXxSi`0$Mb7$1d(d8a{Ok0RhPFKCB|tI#y+6^s!`?0+BcPg4p2Tx;6}!2X#l8FS3u z0oZ^w6Jkfg?j;^l##9|VwB(^Seoq7JZ&8^P0!&1p@Y_ohyV1V<>5u@xTgTqP?(hNx zOoJWgsRInq7kG7Yg@JMYF_lWuwNmqGXf>DqHD3s~LlFSKRSWodBHX&gJY5vi0G@q1 zK41fNzjYCkHf@%n^HHH@NH#Xg|!(41DGCEGoyMT;AQ|DxFl~Qrf;F4ou>G>2H z0$062N=4>!h`^$|1ykdUQzyz8fvgu;=OK(aL*Otw=>dM3;!zK<9-OrEab=jPU$ctlnHS0TJ2aSwesv-twE%yaC`%>*9K%*L&jnnlJL3lLlaHIRYbV zxDdhfY|%(E6mii244*+arbSComj7?h=fLk1vu&;K2bk94emxZ8zm#wOki0*6NZz|Z zIDd*g`5ttDaPP&DFV0UMwbv)}qlUh3di_|4?}Rt>eO84Ct&>htUk{kgrqz70Bz&a4 zHLx?ARyR(ng~~Ze{Gsvf%p3P4Yjc>>SXv4K+nIV344kauU=tEbKpO9mT4^`F+>k4U zDDt;cS*pwR|Ew+TjU?=EUH?tSD5koW&UBq0d<7R?0pGp?fCZ#@_#UB zbLt!_;MrgKo2@)OIB%@8TD87M;m@_(UzGmBrCx6~JiWM0X}NqWcI)14tp5FZfzd@_ zj?rHPOg5$W^QThC1hpj^5ZO|-A;}c&L7qTs(_Y7^=K$?G4jWW&&BYXQUP?Y zEnpeKq?kn|LDPlzIKjpEPyfyiD6c^9yQV=c0|GaxgYZkhXt_ zsu4UK^XG?g(Dn~eq)P(=nv=I|`-fOcQ4YLf7PtKaD>a=ZNn-AG2QMt#3k1@d`z4zR e{;!*ae*n4zI`I4h&R_rl00{s|MNUMnLSTY^xUg0L delta 1456 zcmV;h1yB0X3-Jq(Q-1&e00000`gJvk00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2L?JNzalyh000G4NkleB{J`+O2$O9$_gf^~#DaMOTox+>|4K+Zq7*r9%$pkoq8er~s z)Bxhh1B$EOBY&JEV4(wqHIO8L0c<~@@DOtsz^YzAj{;3Qh)Ags^Q)sB5Q4=60+`ba zrG$)o02mSQEYGEq$^*ip4hUERPV@Xksk+)hs4D;vFnOL|_yCK*1P$PE{?-F<-SWWO z!ko`GE>)F6y^gtBHAxbCKHJQfKpaRg)n2zbm(+9Bd9G>v)%V+0cW;q7Tk0f1|5y8zgaxsox*>>Yp&STiAZBXbCWQbK5h(n4X<|3pSFa8U0DS7$JJ=mwfPiVR<2-eM0r~;2 zPOdO8&VS#hQYm_@)O;FR&82_K7sBmO1i+7K0q;+QTep~}i((qU^FPlxD>eXwe{ACr zl%}8>7T3_?^Nr)~*kLZV6&W2T=3PL>ps91R-<4850RlM|mfla1A#l|Tq*P=shX^dX zTQD`wICY|o5y*OhbsoZ)GXxH^lOEvLDIWCz>wh770jXwRAh0{d|AfrWI(x{SjEc4U zbs!H%EbAtrzMs<6`Q_(;9bN^C&K@jw_e2&GxxETjJAmAG#S8683AFZLDs^*}VTA2l zv3hga1Y8MAfF0iQo721jFblc>qSt%k`kF8Do0A4$tSzQjWDOT0*v=M>BtsDwEy(a4 zbbn)72;QqzTk|>a`^0QZ>-zzwwYXmoh4?S!n?EG)Pacx@E)b4lPre5oAl!R#6srqvTC)k5W*B>vR- zZsv`9lC?R^X)G-Tf$dDa2?kD9aj*$l_J3|5jdw_`v>RV;$dy7A`P->1)#dtf0<%V6 zjWZ3^754!OPl)#ls0=_8P*fw*W*k6Et!m`JCKLgs_rg}f8iCiGTNogL*XJ7-p0I*P zY?0`}v-O{HPy7YUE0vy82KMv~0d;Nyj_PQXeohf$Z$?MU5R9r|f6Ui6F@iV6S$_q5 zg}~0IeC;XuhdPU@7VITvy#6tNx8Z;~LS^>81hsbj;gUQI+MGIv3V8lU{^r{}J-BGB zvs$%&aKi8Q7p1>&sn?qgPcIiKEtg-#ZrytttABr9V02NKWAqmRlTGRU{8uStg4z-d zh-|6aFe_6aPoTAFujABnfOZ{+4Sy=TswfL@fSHr=Y8sGom=^&sRg^~6G$2J;oN`NT zPJ0qL<1%!xmPedjOKq6ZkB1f_kzN51InA!9cne~7d#f#H~MAI3r3KSYr(o*x6v z$y>JlLoDT}9C*bnzRN$bBq>SEz3$+Jg?oWOT64c-Gr|9LlkgAQj5+{cI+7Lu0000< KMNUMnLSTYdu${jE diff --git a/graphics/pokemon/luxray/anim_frontf.png b/graphics/pokemon/luxray/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..49d83d6b758a755a2bc76f572571ae99763d4693 GIT binary patch literal 1450 zcmV;b1y%ZqP)?uKNJwy~I8gup{{R303eaCU000Fw zNklf0;6vxltjUF1eP~p)^QFvrQx~HZdWFKY9sJ8TQbF4x^*OKZ>$3lnn z1b7J?1UeuepzYkr8SOzv{89QL`p7%!$U9kHilTDt#Ntnn?;aoD|DPcE|GsuUc?8&d z1lZ})t;=XTq3-e*MNkT423zXB-41 zQVuXM09(J)F(`pL(ZMvO0fRL_?9XTogh`Sz1`zv+*LxrU0$M;=18E8ofEM&2Uw(l+lBW9C$w9H&Ar3gG`XGi`l1$B2g@7RVWg8t*}Jj2gnmq@AG0O&sp z!DEWqTYv^(&4dF?;q)3GlE2_oaaCV4g5&{9jA`tlPq)D(9Ui>&R0N|-( z?_hU00Rn>69u}De6qrBY)X5eGhQ<4g3t^7cG#{4VZ%_G4v1E3KG5~&y2Jn8y?7GH0 zZ4~7J&pupIQf>eW|I*$=m^7KGp?OK@X{kl5+CzcZ*qY_$apDd0gU29EYvsQQr?XsO z$Z%_jS&qQXMj$gqro4y1vb_Zn!(|L-T%WkqsLe^@ z&5W-m&bY^kB_Z)A zofk&_*X<3{H9R#L==o~|oVX00*U?P+1xD~LWV8xFOcnHZMdzU4u@i!3?t_69C8F#LWcl*AHA#1bu8Hl}$-xtQixGE5>foFdeuMdmt{K}INQuoKVDEx&q zs#&ENm#NowrZ->QXZ5-PaNRkL-M>FB%{sNt75zm(xG%jQKV;<&#&V*+AiSY!JtI?w zFma_+&2^l5B>*J=yse77T*u6@$H6xs)iAfxuLMKoL+SGjNLd!E+?YJJHYnB9?jWj~ zT5~9`QB%8D0JB#>)<$lfz%SO9N`;P{2&Pd5XRUNHU;aDrnk(uFl3 z8|(wI;!ohr`U|n#0Q6=-Wgqa!m#sZ`YzJpF%#gjOZTrA0`+yMw6!(@pK>IK*#Xqw^ z%YhI+wD*>j281^K17T3zTRx#24M@{JpaH8|s5hj?qc~{#hbWSj0Rc&kw`}@{m{;TL zC@KFl*7Ogg8sa2PQ?=C{e6L|E5OA%wOEzKjUpEQ=0J7vG8u2a7)Bpeg07*qoM6N<$ Eg1}<3fB*mh literal 0 HcmV?d00001 diff --git a/graphics/pokemon/luxray/backf.png b/graphics/pokemon/luxray/backf.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0fe29e44d92ba7be2bed257efe9797779e107b GIT binary patch literal 768 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 diff --git a/graphics/pokemon/milotic/anim_frontf.png b/graphics/pokemon/milotic/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c8fe0c2b9153a5a69a254ffa817cfcf8613faa GIT binary patch literal 1651 zcmV-(28{WMP) zsKFV^4CatQwb3}L+tG{ADYOTJC?F_^-4-+u8%Wck{9pRs9VPyd>}2TBGfaqlAHMg< zJKp!JD4!l*Xg59)CrdZd6KxE*Ad0#)jL(s3FfQvN2w3oT1&bXdWFs-ybJjzQY zCV_IAp#8M%>q=XfNq;(I`~en7J819tzCP^_fu7C3Q>IX7e}=g469R`b zpsJM-u)-LNYV?O&5b}w?LyVWc1}z|vOa$Bb^*-GtZGXohh6~8=8dUHy!0o*neNBk# zIx!r4Z{vHdQuRD-1lWYr*HE93_|kA)kDbRA4*)r#$~?0*4+PQ-x2 zXl}T!VQdfQj&>vPYXqpGMoTgJqY4z}!=k&3 zNzb-uA_G`v4p8PXMGiOtU@b7Wvw%GyqaMQ(c-uvQ51bS*OY1oRo8V{ZLxi1D@9^&C(i2Ojo%?11jeOYh)I#UA=&fO$P&QBypaYBK>uX^(*b)&jZ<)2+@Y zKtBcGJ@pO|*mt)h!kPkTDMbJt!*m_OaO40BfpxeFU6Oe=87Se^y&(8e#_fCyp(z2& zvdqaqM*?d>n4~CF002K=wibpV9Rnc25MT!hk*fd+0su;O0)+Ppuc?a<0YJ0a#2V0s zNRWL^0#ItU-CPT;(Cpf|1OQl_;aYDV1XduHTbck?v;@TGau77SJfA@6!k_#aPC4I_ z_op+R8?!)kuZaT@$@psZmBLVc@g6PV&_0L)JLg2)03+E8?p6jR4Nn+A8K z0f7P@gtZh<{`%^eHNwk_n|cEHL<4b8?Z$`4$INCeE z91H0Of1#^xW+zc!2%!5<6iEQ2U3IbmU4|`=ns7<(Q{3(=WHAL6=(5clfr-CQWeor_ zO%Mu;HUXqVL4T0~>N5a9)XdJvp`gD=yHsB+3%Q`9U0e8z3_y>@0J~382clZ_!xWG; z_<)e~Ijx61R6S~D4Tzh05#a>jEHfEXM?H|{)tTfu>sJG!iJ<|>%!MU^XA*eVyaHgx zfoLKD2AK-s(KotHo>vm~wXh~bN3UxG=QPo%k}=K(R+5`U1F zUew+McoayBQBY2h_hkvN1CZu1K=^}t0)V>TD^{>F09uUT-kAD>fe`jV0%4G^FtdmL zK-dRa!wT<@^>`xeg8;x_bYJCKP^4yLS literal 0 HcmV?d00001 diff --git a/graphics/pokemon/milotic/back.png b/graphics/pokemon/milotic/back.png index 77cc96ab14efc264f618fc55e7d7706baa5b399e..98dadef06adfffe28d4f76166cae13ec0e599360 100644 GIT binary patch delta 612 zcmV-q0-OEF1-J!}Uw;BaNklY{-_9>!o&nCKC%a~0Nw92tRO$un5}p=Y?6S^eEz<(gYaV0V80zHdg$2EqSbw{`t- zz0&$aqS8U2ukEgO-BdJ3oKH`XNT(a0t_rTaU0V1zL0VRAJ*R!^cz!L+%#?#p`fOYW|o+JT-YlExcdS(Xc0faH2 z!C(^xfQ46pGF}{DAb=5o@C=rI0RaYxmwo|?V1S7Pb%W)m_-OZRi^*3j%}%M17yJW&kYUwF7cNz0M;DBagrLxMkYt1>hF|0000pr z0006jNklxjvPS z+|@7o{isgie;ryxvG3BP7M_Oz^L&iDCsChn+EVEQek|HrcJ=^bdEL79fGUzmuC2i= zJ&`O1fGV@N>xAe5qH@eTA$mZN@l<&-1c=d@frUQsZaFYO!N}+fe?mhkW1^}Lw+686d5m>L)j(}7} zW#J0^Tq{Mu<8&%tvQRsJf5m`VEM4pK((o70z4rE;Q=2GDWj_VJl$ zTqFTG{O$KQbsvEz1Kjtw^K1a@i$Cxr3FurKd=93+;eSPX0Ko>d7#xBD7<&aMwt-U{fi5(}HwIV@Z3$p*DqCNKBLk;C&~8Cc1W4w>1MrIiGsMi4)T#$W^^iEk z*p#L#cWnsc5Z_wBp#eAoeqI>Zy0_8vVZngx1N%AxPFYRv0_>2?t6Duq0|*PKQnrh% zBDBEP+SBn85H%5izJP4YAsT=$6PT~8_5yb;z(w|GfcGlGAaHa5Mzm?a)5LpheeBGH#yRMD>t3#MqRkD|ZOv z5Z_wBp#eAoeqI>Zy0_8vVZngx1N%AxPFYRv0_>2?t6Duq0|*PKQnrh%BDBEP+SBn8 z5H%5izJP4YAsT=$6PT~8_5yb;z(w|GfcGlGAaHa5F>l&H6vr_V%v?cKrAx4#q21^+k~`XdNGMYR zUMh7+)yiS*QfD_MH@98PNZTRz75e4+&Tb3A&u4YZz+bR%Kixa-&VIjE>y$?rab_O3 zAn4g9zyY+qo(b?mfS`W7jYz=62sq{$gzbQ74FVvYy_`w12CeLTZ@P%?& zV3aEta7O29b0zvPQHmbmQ0)ZrfH&Ida}Z)cfAfraNq=D|G|+23;Wx^~u~hY9K4y4&yi|Fe(kC(suqh4kaqbD}9L?Np$EJT;p<}5%B&8U<9N8z%RJo z{XkKwKwIlWGZ2@f7fkoJfE48mZ3ZzUAOZ7uPwuzm5BO549iq(uFd_jVQB-4>wIrHW z^)(=LSbZQjsWHj@G}z!5R3|j+0bl);=KKa4=@J^a6`Olp00000NkvXXu0mjf0VzAp delta 711 zcmV;&0yzEb1)2tsUw;4za7bBm000ie000ie0hKEb8vpF>ljA6vyLA&731q5MgO-cYrNCM>3=B7b)u0CSH&jia>5w7Tnz- zy&1YVV}POe75H+zvja)v=d)N4L;gyZ+)wu|cW1v}t98tO7=LkQ9=9Oq*e1XMw7rfA z@Iru~e*6THfRPb!%rgkv0n-`;K!{g{3C3euq^ZJuPK(6)60z$}+*v(v8ojce@p()& z+DUTF06+<20@^p?>8eW1^EJQ>&x7_NeRq>qi5EE$_H#Q}$h$O^a>W4ow-P8)nc^7% z%KmBh%W*k91b+rpLT%o0zzZ5BqA7fhVJBCdY@@N$Jdj4;cV`eCZwD zzkvpN0qXtGWh&=t5g`zJ5dks-S>1F?&^U$#Kwo4I_B1Ap4K?e?@fTS4}9kUcz=`UlVbQnxhycql?ynbbG5k= zT^K1v4{)e90(rn2Z1gz@(WAe4#=N936dLHXp70yx;?ODqx*Xh7O21kWAe!D}tsZ|9 zcA@G+^Xrtae#|k)93AK1I8KrzM#o7$ird8CILY0oep)5|I8Iy2G`*Gby3TRhTfs=` z9A|4N%YRj!VNL#kFF=*rAleK70}>DtMKyF;OQLC2R|7(a t)dzBu8k5{jgAIN`bwaZq@YRoL&MzQxBU%Yh+SvdA002ovPDHLkV1lwNKFa_A diff --git a/graphics/pokemon/numel/anim_frontf.png b/graphics/pokemon/numel/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef4e79541108fdcf0cefeb6c792b6e97985899e GIT binary patch literal 763 zcmV|r5aKK>j@SxDpkofrc(8$F>l&X5P)qYn0W_2+IcD8U#RqSDFH&5iL^JVK$>hVs(qiamLP60j)T`F6W!!8_OP@N50Xz z5zkj;q6rj1M8G`xaFeV`z${+_O!3@rWw%L^Wu+3Yaw4pkmOsymSTR8U;{Yg?ctL=) zep|g=esT=-sfFCUcY0pvDFD76@6-KS%3s#iJOwukCuuf1zD`ob)c=$M(8tT%^SgnS*UcL=-&$Tn;d7d>~xp0T=hd01c=G zpayuG>j5**4|)VF@cp1f`Tm-tJipTc_95_-1K?erkBjt$bXcIDO9yaF=W1~+Ixv)y z9^gQ31oD8}->7pCqDz1CjCo06AQaFxp79&y;K1AhbUC=kn0_@wK-9g-j4po@_CehT z`qwGn{S>D-#mRC0iQ~j^taY6DvslC$$7$Vu=_QNnYR8#pNwO&W#iQf2D*WQnaUOtG zmE-ITWx1+yoR3RTKTnCZrdIK?J+F3}(f5B-80TsG7K?%x26V051N1vk5&C`uV< zD1E30qHXqqnf@k_qI{#xAch3QXCCk2{hIs%UrV_`v={*TBp@V;a^SF*L}g`10YU|< t59B5lCb=(zHGV;T0=*va-A_>;e*h~#DcnSaneqSt002ovPDHLkV1hixUNZmy literal 0 HcmV?d00001 diff --git a/graphics/pokemon/numel/back.png b/graphics/pokemon/numel/back.png index e895fefbb02da33f3dc75eaccec0f6d33284f33f..a631f1c2a9e2646441bdd97d742639dc2c205d6e 100644 GIT binary patch delta 469 zcmV;`0V@941gZp(Uw;9$NklTO~*Z;j|YB_G5HW<#s&!VrNG2teE>P20ssQQIuf9P;(rL6qx}?6+8Hpa1BTLd zHo$aEfbKxLP6GgeW4TqRVihLc4l;s#V3q_pgPiEgSCPiF25>E_BXu&J-hX}wdMm=968M+_*%@~Q;33+@l7LvO(Aw?+(Y<~iuXSO7OTMQsUKCvy zb@h?w1U(k7r6aA9MN}p27pw%F@?9Xox+Ne%g&K9&5xXkxu?ZgM)To0B0Da*JHtG_< z4}ew#FcTrn=GmFoikFE}y#%xAr3|$50yG8zwp{|ed`<>lTEcO(s=JU*F$>$M0pF2XskIMF-~w2MY!P_zE;~ z0005JNkl15j)sR!L_{?a0%4@Sj0i06c<m>?9ew-2dXcOQ^jx*MQ(6K6pprecpR_-+PxD#(%&4s*QR(g4Lc;rNNH) zpxtW_qAxKZq>VsJ3k)e~0q6k}01yCD(*P9=cG0QzQ@}V#fo>Vl(VnvcZr}pc+uCzF z00K@LI@p*rvXkNBU<`XNE?*^f#=n`im@o-U8H;3zvwp1H_#Q*U76>p| zqVFvf;GTV3Bqk!bepd>tHUKsja>n&dpvgCZI|O2-gZaQSLRO0G(|BPkLx2)-5tH1E zS+=djjbpwx#AX+_d672&L6DdH4K)*t2p7v`0gyn*xqWc403+uGcgz!Xu_QnX0L(-P zvw1qOR{pJs)G)zp@dIbx$`5MVK-3U`?{5KNwu4Z%pwucFb-BgV{6ZkjPAfRYuW4<5 z82}Bd1W?auI{A24ecNVd3!sYF?iS!unE3ek(8$<8c*p<%00000TT(hm00009 za7bBm000id000id0mpBsWB>pF2XskIMF-~w2MY!P_zE;~0005JNkl15j)sR!L_{?a0%4@Sj0i06c<m>?9ew-2dXc zOQ^jx*MQ(6K6pprecpR_-+PxD#=rflje0wR)t*tM!H)Q#-D?n{FEJpbjX+Ba3@K>= z=m8S|5CBrs02K^&(W&)Qz&J>OZW++gp0fgO-~!a!+H*Pp2psCA!YFnj+UpQP2px#0 z0Zt$zTKZE+8;5aN`U@0u+KUFbTi;;InOJ>SJUbAc`{Cc4`-g+ z1ZS_0_R$lIBoW*!V-=V%2}~J_WQntWtlan>L&FvbFj=DSEfnCMeOn|ZBDj863amB& zHWqTm^-ZA3H-S3@Vx@!mz%xQtitN*PVJky`5^)ie+>BYat;CIEzBa^W7q@wlHvmD9 zm;4Pi6O0HK%VhzOK*+gpu>d3I1$WF7bg?8r3joYS2(x)QuvY%9h}1B_Z1DqU-pUVZ z+CbD0fbVYsVYY)%wxHB18g;qF)cisq%}y&g#jj~?ei;A_s{~NbX*&6MSAE-NXA7W; n*zOkKQsqNh006Q6(%;(`1*-zw+WRDS00000NkvXXu0mjfrZoa| literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pachirisu/anim_frontf.png b/graphics/pokemon/pachirisu/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..55d20e4922e272762fc31f7d65dabdb1f31fe9bd GIT binary patch literal 811 zcmV+`1JwM9P)F>l&H6o75XLK$sSl-bXsb8QQCu7pDw!JJJxSt-V>l?unmlEBclYV!lS zbWaxkLDe7CcW0ZDv+pc*O!FjI?(@65_YCjTwEsBtHo!Jp5`Y>oTL9g)!O?U%qdN@f zssI2-59ELiK7bWS*9{JIJt+{{0N}b(z#t3&UwVd+_&h^UPhs*Vgj2RYAdy$U9lOCR zf`CgfB2xlj0>YyPK#HFp0{sH`)CjzuN&y=@%jQ6_p3qbP+$o#`R0O(x=tlrI;FZ8+O*dkRiztE1BoTqE0@!y<*WwQIc>%;6$f>x45wGxMSqUUd zx)JVReA|bFWr=-U-)PHJZ049yf?4k4086lGcu~e*fBa1L*Y_U-S}Rep$HRx;gj^q` zfR@u=Bso3?0d3qt(>f!3^q2>4Wq{V%Q~F35kTwIW+3>I(DS&J?PxiU=2)IRfyG~*y zfE}IVL3T2L%&^Ki-AaG98GjSEJ1MZhLeQ0b{elh;wJtx|0lR#c#d2UVPw}8@d5X@G zS1VQj$#Uu?Ug9~1*`_E?o1!=^iqitv9-yOG3cx}@_Y?rme^Vh4I=JX4-8U_O!eQR2 z1w$K7K;bAR&d;dGP)nf~B@UTDKtM05&YhNgyT-4YDEot0;*n z0+yu)(9rC2MG@zQXdt!m>T?4*SCprK5fLC$-?=G)&m#fAanvVK)T@9?(Sig6nXCoF zFv@lGhkjugf}$8CI|t(0gg3rdisCb1lT&dnTosCff`Of)X?<>txuS5vST{~@yMrgsiI=6!-wXEmFC<7G$G6$~zGHNMJYT%s2KexD z$M^lqtpHRw2jFl^kG`sq3WUERaH%Hf(~X5>mkt7Nf{r(+`~AiS@b0~1WIy^pT-E(5 z1z^4bFef|x=&$@i9f0dz63D)1tto-({(ultzZPMlMwT)gM}Vjja&#v|;>4zm)pCST zTmd0BA_Ib;ycRN zSrkPp)ng;nE0`a?y=8^>A%{twX1&6xz`{Mcb)mrqD#h5)oU#3e3&+HJ0Xj+C9^KCXPv z^Jo|@Tp{8WOhOrMWGxyFuYYfZVH+0_D`OJaMG35ajCx^j;kezg2u2zppTb!rdUyzy z+YMqJe18ToDAHffoQ&unBf3iwo`;7LU!4qsQwS0CZj4WhcH-W|K|S zc(o?FBX~8?kJ_4lu)G4uVho$?1|rab%0=OnHD-)ZcMO#+m_h%y(_#v8nr0+0e^ml8mO$fP<7#y=VcI*OO(C=mZ^1xa@l zh<^!OzTM&|5dV(xh3EhLMx3L9Y&Z&}yB*$mSF5XYr638wR({}L`$|C)j$+y&UgtGJ z)(Vnv6!V~eEHkO845PZ?D8<<=qz;d!$}sv#M=?JXmlX6N`lJklB^@RA+j2=8Ux6P; z!;lK1g6Rn;5TXPF#|L%zr5T1*D$8hA(;onTPj=YGjM2kg>A`R~>{mfi^i+BA zl>UY9JuhM*8V1)5<#?U`^I`M}#sw-$JglC=ogGGZy~QsJ-W><=>@%OjUHJnT5GYDF z7SASz`&tjgNGL@a#{<}Y`Ik(80tXPl4saymGrW9!%(FaffGc;fEs1vAFdhq~gAnzg zE2Mv4wDpj*nB8QB6GEWJF%qMs0NAVnJ4MJG1T6xAavdW@Am)T(ZX>}{!oL-AqCO=a yrN+C(Iaz-we9Qf1kv-vVh5OQV@cLKyM3uO7qz0000Iu*RB|PRP27L4gn8+ai^#Ye6>JlN?bPkn!0Y1TMA!forsX{6M_h1O)KoRuBXi8v&?r2EhJ? z9s^Y&6$pPr;6iQCrE3StE?flOj#_@N7Id98;QdF}$bJrfysQNk3czd)U~YEuIamh0 z8URW37>d^`H3g)Np zZ&+cq4!~hY=s4gO^}=?NMwC6VEudp^X`C zJ%H+#Cq|Y=Z5};)1(|#bZ0<=+UYM0BsMa?8XOW*4bFCSE`~tfS-=^tG32} zEUy4EAHtBmkr?Sf`Mhw#9GE5XhEUmp9rXXUyj?HlVN`^A9B-M6fqoSyYzn6s6LQF{ zTQPJEp13OuFJjCm1YYRVVLRmm280uib7Up~k@9`A8sV7N@rAekz#1t8KQ@uCfy+^tsRn*IYS43$!s=^%q&o`4zXUGcZEzHbf7kfR4}N(o&QL+t z90k(d4zK;o<>i@DkOW{WKM1Y@r637MG3^jP=T$;h3X*UXbMH`QQe7EFWzA84iqjiN z9Ue`TVRVy@Vty(vDCk4B^avCPQG$W%y&C+b8HQCl zl+mo#@eq*T8jzzZnxp#_FxMRhqPMyN?s^2yKobU%QvmqE&v#vNAUo939rQp6gc<=T zN}F>pmfcV34}dQ_Y+`)q;jZ+5px^IzE1)QPs=Rni|H4b(k64I?!F5A9TBZN2AANy! zfr=6Xp2D5&N4K5%uXElWj^f#8K8CyU2QVN|ly)qhO$_&y9*BWZiZYA`u>I;UOn;a# zxC2apBN5->)x$%cOhHBtm(MjXs-BzQ`$H$qO-d%z=}9{v3BHQ<}RU(a6f?>>J6lvftA T_o7jh00000NkvXXu0mjfIx-3U diff --git a/graphics/pokemon/relicanth/anim_frontf.png b/graphics/pokemon/relicanth/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff9f7ba30dfb1ec39d739a2dd9aacb122cf101c GIT binary patch literal 1257 zcmV=P)vk#J~u00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2M#DYM9mhF000C`NklF>fMA z6vuaqr9mkcf^?Ee!His3P6Hz%qfL>Iu*RB|PRP27L4gn8+ai^#Ye6>JlN?bPkn!0Y1TMA!fort{Z;LmSRROpUDhEA00_Pe~szVFV z!}1<}4jqVrVQ~HrP|wYn1mynMVPeY1q&!6cTI}Ny=glV9Uq{MLaE{Bs_k9|Mb5DqP z1(Q&QgRDmV{?+eJ7&h?`u`(usDN11ZQ`8ANbJuGR#b}@b@+q7~qJx)UdF@eb3lq;c zwxNv~ZaskNmM2D|C*TDDWo&}&%i@B&hQ(t$@uCfy+^tsRn*IYS4@Y&ML{>!Uox_r>N4uaDSvpa&8I8J<=H z<3Ho~-bevR0kR7Tph09(9R=eb4Fes;PjeKA|CNHII|{_V1TNlfa1@At*Z9g0et9d- zP(jul1=8IPul>vA<(X2D1Yj#a2(AL9APGk??GQibRYFz@l5iAr?@(q^T^UAY%~6We z8%P}G6bMm*f$O~*{G}O& zRXUW>tk&@mklz}Rqbi!C`xP+P9R{Mex&rQc1kOMc29i?%_`%P2U2-5h)Y2XFKna8z z0VqnFb1#^q}AGcPpSMdaAs5O#i}5-;Y>`hQW11Ia;OvtRH=W zb%BZ!1D?X2?MJtr`LA={9**MKXFi6z@&_;=P?UBoo=pt*l^%$JP>M2)2eAF>FHC=! zFt`IufFlv#;nl-Kp5OhHBtm(MjXs-BzQ`$H$qO-d%z=}9{v3BHQ<}RU(a6f?>>J6lvftA T_o7jh00000NkvXXu0mjfSAi@o literal 0 HcmV?d00001 diff --git a/graphics/pokemon/relicanth/backf.png b/graphics/pokemon/relicanth/backf.png new file mode 100644 index 0000000000000000000000000000000000000000..f900aa794f4f2bdec40f2495e20ca19102b0e2d6 GIT binary patch literal 649 zcmV;40(Sk0P)5ANcR}11z>#wWCx3dRhama(a|SS&{_0 z0C>`>1-*k&(ewMjW}BJ3VqoEa!sXcnfu@AF4v#U>Z@&S)q&h*MDKQ@DbvdT*pI&FAz+b>iJr}~yPaUB3%?+gi5L0OQn~7!4 z`EdXUBsK7riNC$`Q(fCT2Momr5m$bGd#~SK3!rL1=lcRuQV3PB3j*!z@P0w>k6;gI z-_wl6wTnZWf&hwu^!9vyaR3ZC3r^D+w~4UK0RtA8SNz(PGwQm7mVd1Ue zHqE73T!n#RK&sDe#+~aXeZi1$A=7=}LV!wwNCrGdOBo>sDshD4fI+Av<}pZRLT08m jiV1xTReb;daF^^q(~L|GAn?`*00000NkvXXu0mjfGS?hZ literal 0 HcmV?d00001 diff --git a/graphics/pokemon/roselia/anim_front.png b/graphics/pokemon/roselia/anim_front.png index 814568e648db05d734c15d46b413e3378fb7e0dc..218bac70d9ab7b3a90447d81d14eab41a61fe819 100644 GIT binary patch delta 1013 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 D(Xkqn delta 1155 zcmV-}1bqA835W`iUnT$va7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2M#JKYfNN! zkzE=jt%)8?)kZr?wB1#TDJg>o7vht>6d)anj$Ow_fk<33#);Nuk((obkS*;&lkVf) z>GA3QpX0v7z&JWTCkXh_3_w_ZG#5c6fJi4;MdmQ}fRw-j5*fh*gbZua`P5g!Bp5v& zh?%`9!03U*4IvVEdIv0rs0xoWq9|sj z`Bdl(qWEn|6urEd4nHSBXyuO&01zur#cihj znZ#;(1|ZBYMs@J4!}{j}sl^bp)_Qk0gNVhAK)zv}-{!@6KM-#<+HGsvBPDu(;?t6@ z)oOI-#c5g;6TSlNMx)WSJKCm~OcPm5`3iI(-?mNlluSZSXM6x`aR^fd=RkH(Nh$5` zFv)k$VqY77WVgOfHWwBD2$1fWXR(bcslQ#9Ntt`tzb|R=ZVMV%8h2PFtM8>vLX^Si z<{lBZI_-`H>r*ANB>k~o){z6my%sI2(K*9dK_DhPB?|Y@8T3bY7UG9?*EY{F&T=}% zl)yedajpjA@!z+=ilCV&GD;1)oQj%g`+ z1@jX3?9~KtJ$o>^zFp3y35}6PDcP@kiyFB=^v56X*7sCKbwFNtGsHmNhr`jwkVSuF zctCFHYCIg?ge>)Z&hSJxhu!he83citY#22Vq#j-xJA(Dfd;j|xM%!5&e1fs?pEOmWY_n}(;KF@aB+nE+y&lP_6I{{=e= V?sBXn;HLlp002ovPDHLkV1mq08$bX6 diff --git a/graphics/pokemon/roserade/anim_frontf.png b/graphics/pokemon/roserade/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bcee6a9bbd7ff98f536f712154109ac564ecf7 GIT binary patch literal 1264 zcmVF>Kpb5Qb@h;UFMDo@{HP2UE4tjuLHmwPH%j;K8l=WG@9shoocIu~8rr zmyB_uwHXYMLV*}43P{>A6qPusaGm81ojO(WmQB>=%~Fq4VH@Im)Q~OhLC~Q4cz1ew zy8q|6&oK~+&(BB_dNc))79Y*T5J@01Nmh{=gaRNfv4CV&3IHj~nshe(g%k#(#{)UL zHwG9z1bI!01)kmki?lr6miJOHi zok5nr-j?McFK6iIB(K;&1hK+6s1^HPVx0kO>{M+G&nxsFQ&`z9epM}FjOhh9Q&m@f z`Rz@4_mlw$W`42o{!Q6gW?e|Z`nI#PQ{L0qch)4GBL1$+282BMLp}DpqY;a+a+lA2 zf8Y=PWB^7%>-j<4Fj`a#!Wif?Dm;1J^{EvSjd6wI@es0up+7N0qUnWSo+l>*$lr`2 z1w8N9puo|^@d)DY>&Y)scRcSMr)-k_%GGEjlE_&eHXQF~MI=Viu2|1E$z=p^>Rua( zR>`(sipE?NIH=catshgkqyUgI&}5559RTm##3fP$K(HbQ=)w%%PbOB$MF-`gKeymG zHP1OK<4rYS4yp45~G8h1y4qw3~l;ZO1%sZ`_1wF;_>+EZ92(MmG zQ50($z-iq7@!yD#+K%Kzg2H)*A2bW{{D*7RlG#^V_^UI|(EjwPw>D_ejeDpiO8=+ild^ zv+_7C%gKoX&04M2_FBe9kj!9JPEQnQLB8oZ`Y8@W&15G4*y0e54$cAZp5pDyWQQ={ zI^(~z@ose$Z_I0xBS5<4obhXATz$K$;u80;dtcHL?FKY(4eqdvm)|QJ7;C-3%{?OF zwwf&$)~AkDMfrWTWC=bH_gXaETI&oUO#m?w3D&rWey=;Yvk>1m+n#fd&^l)kL@=n; ziGS4_4*$9Z!b3o44t6L}3h>FvupbcGohY{)>l=i?I|+&w0zNo^TR^C_99OeUBr4pq zS0OM8?7`srb~!r^G!_g(@P0K|)WQge?(pN?`X0-u1;~qF1|H!|O-~-mZLjNkl`nLWzt{P_%UdfNs(?QBiFBh=?5ksKO1; z+ZB;?z`!w5 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/roserade/backf.png b/graphics/pokemon/roserade/backf.png new file mode 100644 index 0000000000000000000000000000000000000000..1b037aada617a761151d4d6f08e1c066f676cabd GIT binary patch literal 789 zcmV+w1M2*VP)l&H6vq##@(>A$b5W))7^xcr9LiRy!FCvu(PvhZVAB$sEI9WC+K3NO zMRHg=Atha_s)?r#&BTBh*l3rkBUviOrtgd$8{05febV`W|L^|q9e#HR{bP~aEN8~0 z4Jt-R#L{d%Fv%gYByAujg^a{wHcpkZGf~1GAeF`_lf&_Hvm!_VfhJf=_)NHjMUQwR ziHYrGmx~Lc|0u*unMffa2Bkzokb)>l1#d2rl`OMIpg8di2q8ukI1GWZukWCAfRsId zLSiK-fdLVh2CEqasqPbmJY5>Z0McePzP?Dxq~hr>#&MumlPZ-80Lxgd5gnO~Dx?Sw zRe23SDU~aPRO_jL;sF}`uG#=7FjgDKls!NuRZc1FEVc?SrRRCyw6Ocpo0R?7Ljb#8p9551Rz9oz1BC9 zfEoq9BmvZl0n@1d3|Vx& zjI#6lXn)3_?Jl zXN)mEn%F?Xm6P8+2K_SZX{v&#!)QH&Rh{?S__gCW!_YueDb&b;(H(r>#aOX`Fdhx~ z$!kCfw%NTyPY%A~yk~Lk|BG~axcS5Ej+BGZ2;)5H&P8Al0rU|Mj6H`7^xwo^EaEzi-n(6oAhtW@1Qeg#oenE)GcT;(Ij&b*XC0 zUC&9c49NnxPG?AJ<{*{-ft8IFWx5Qg$W#1B@tmYcsn20Vf;@T3`+V=+kKAWM_OXw@ z7p)yR2a|?ZpEnq95(}EOfCbl{&9){aB+};?| z&l%^PYwqGN(d0fbLEw4@(fB=eNf>1(+cjh_dG!^}W;ox3ibj^*2Mj2Ch-SQ#hS7c)6n|m`Vh%4-aUWnf1)!M6%urpVm)j*c@D{E%#k?sBl_zq01Ou~xdABXd zP^x)US*r)JRlZMcVXEO=gw^e6KFa0jwmsm*LjKU7no&{Y0|2#DLJ!E>!zDJN=CbD8 z_4^bD;3}^>+1Mh0eOwEe)N$~@94rb^2hbQ`v?ywU(|-;EmlEfq2Og)Xh_a~|)d8{N zk^%U{%xeG>x2MnXL`zZsCpKGRe+%woAODoPSC^Q#E7>GF)s41o-l=F%n<0bkUZ znV~)NnH{4KJkbEG8`x{W20p2p*`VFi-|Fs8s0N7cBix)wyJF^8w)H6@#^Tt3wPv2l)0!#zRVVx3THm1Yh9j zilLVDN{h=LUC;0{YB8V7#)goqAGVA5xTn(rioVncK{(_dZPKlpa{r~{UZ%< zP95;%M%@h!aFHhCOzcp1OlA4myF=~LWb6-ikK6l;^nZ?D+Rxq($^v1d00000NkvXX It^-0~f^}hd`~Uy| delta 824 zcmV-81IPT_28sueUw;4za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2M#qLM#F>m z0008*NklKX21O6u{3_%*2q`3KI;zivv=-_+C>5b*Y+@%Xm(DWk?plbvmP_ z?i^6zGqCazP^Qa(iaf<%f$zd|(juikhY<<#lqv6*d++|_et$>EHn#EiqOl?8VbTh! z^A_WELZMy>H~;~0SvBB7FNj>$SynS(JB-Hxb2+G@nxPd7_7esi03;4(XvJa&Z($jM z4X~=T4$#({6#xU+?{y5bh@Crt!Sf!MW#HKTfY~k!fRB3=fk$G!hTpwF;Kh{l))n{h zoAB}>aD~9l6o10;d+HMrrbp{FR9C$G3gaoxH>R?drVjxNiXOz2w-SLZoQUzHwAjlg zX(+G)v4>}gdlLUXR%rz!NM$H-fv1WRC*Sc)@mnm zir-UL+Il#XqP!jT$C(=4HU~VPtMBGhGs^R90H7CIntuUxySKnb^h{NpyMCYI09_4AVLFkcDj@QFGJp=TvkJh* z?dfwo(MneTiS35m-h$iM#y_R*)1?S1Thf&EtuwPaRW z)Lk`6n~K<`AuIr|fvZI8N)BhH{Y3ZwbUE##w||XZZ8!{`Iq3er){9J%+EGdF9pzE_ zbPu$i&t|GNDa}I`a?cg)YOU~-o(hxP^B-`iwNwk8rKv2-o#x*PAj3C|emybC-3J8b z8L6EQ6KS$LPS!8X8zv$)ZJFcZxgDXqYa)q_`o9MV5y_F^g+UQeclHkrz$x`0P?uKNJwBXFhJmF zcmMzZ0002OmUct{00Q7iL_t(o!|j&8Z`wcHxOrP<8Pgrj?S#_d-LJC5kO) zJwq-XU}@`^%q_&7sg(W?UAuLyn2w=Jwg(URI*>s6p97G~?|w#1_uN@wBqo z7(GU#5GxRCc#(>S0K+K&#XM$)>LR_|EWv>{akVMtEm5dEk((pbFbkOXT7nFvnn#tj z+KcV-dFlvD4d)`PZb##3E=RYm0WTKvm;Tg@iXtBXsDGsrdO+SDEU^(amxgoK?^7Ir ztK4+5u|)vq*a%qEb@9OLFA8A-Xbdn~6h`2*jliYEx#)psX)2;@Dn`@*#I8pM&?T1Z z8A{;x^f{hrDa?Ojt0{JGx?SwzamC8oThxuVZQQF{XXer-l%TqW!OR3z;MY*yU6Yxi z4Pck*?tdE044swPG5Ww04Zu2qvj!aCld73(v~&7b-JJ>50MWht89mbg#7;ll0T88` z4hWrIDZLq#YW8$48QgpVIJ#o6Hg9!^!Pfwv{>*qtsqSrTxi`T#IJ{!0CB4$(vIm#} zZAoJ3hNuC!F0K-7NHLu2_7mOz!{M}#-qw1xX@4_#ZlnAAN-c9i>L(Ssccn||ivv(< zF`vu&v@#D-%Ds@Vuav}3b{^{FUi^k*rG#9nJj+B??zH$>0y*Ac)Z3{}?j9hp$VvTj zmVhxt)LqvA z7cXft&cqgV$5fWr-YsgE7GwXgd)(T+3mB=STGO}5WtWi_`opu`1tT(V305{P*7MfFffx? zXaE2J0000gT&sKl000SaNLh0L04^f{04^f|c%?sf00007bV*G`2j>O{4mBY$#Is=l z00QVqL_t(o!|j$aZ__{&fX`LT#E{qu6AZqK15&&AUQ-2iiGLc)WjrUnG9(M&I-OBd zGY3@u11moPWx5Qg$W#0m_%A#sEmG>cup-D)l)>-Iy?b{Te@DnJcJX(H*C@Ztd5iHn z*$d2o0}v1jbtB+HKZsq{Syj_udyFRmb2-Senx>KkhbaRN00IZoRI=F7TUbS41FS1; z0<`sJ4Zsi%`+prx7m0HRFnHeQq6(b2AJ-*-Px=&rN8x4-zk7-47mV}PHTUsJboCIp zM&M=!(d0e#Nf>3l%^I>BzWfT48TOk{QOmN2fCc3o!WnO+Ax_~moJ=c=jnQQ^3b6vQ zN9U<{2rz5`DCRLUQs?Q#W(f|wfvZh1Z;L|ZiQF8)!hbAa-fs#rl4>4R)@mxXMi@8>a~1 z9vcChdLAB_{Y4>60F430i^2$;v=F$E*oz)`lBOccreaJDKN8i2L??iz4`UscU)(e}x2b+@mm28izE&*-TJAWr)34uB}lbU^5K zOXeWfIRva?Vp_u>Z}D<$Mo1bkWdvs#=+FUqu zMQBN00Bzn2$(7R~wh0e)V>=`^347AjI}|~lA2a{?h#}<5{?CGW_ht3~*fQ%0(rG`9 zx%Gq(fDkx0Ar>i_&nJK!Vgm#`{KmN@Hm*cK;02$Hl$|-ZdVl_`9SHz{B7z0yD~=W! z;CKh{U+Cv&4H%`ndhG#m8l#Jy8D`^|)=(YE(`MZRpnuO-%mmW_E$hu&JphUJvz12U z4yfw-eMqs@0C+%IR_h)}v;u%=0Cou63JF3;7}x2oX@HgoQ5}a)ZsQm{U{@Au=v59m zV;+DC?f`HsoqrK3gpySc1c~d17o%K#485d2u+(SIO8gumEImM1Ns7iDsF(mGq5imf zOJ*J5FP%00+)e?vGLsONc0I4t03^b$CzhFci|_U+`v;KN6Lp!+0g(l;5f4H{-T7W! zY_5!EUaz_U*lSBrNligGKlI{UZvbhL5L%3Atlt=j9)F;PGDs^`MnxW>_j(}$KRqFo zMv6v>;$+6WzudjmxHd{&8-=mDHjZu%Q7Eb7sFO2kkC26Of$<$x$kr0hI{G2@$^qi> z9o1#H0qkA`RgH2*@DU)|&w(Mu$t+}?JOUaE!0SkZY)z*m0^$dJKa2y|R!N){`Mr6Y n0F(i8-5zGVRSsW&eUAMFoBZ&D%tD`}00000NkvXXu0mjfa)k8H delta 585 zcmV-P0=E761f2ztUw;4za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2M#qQHmP@b z00062Nklq4}dj$&ver5m4!MzkZa%tGUdH8M`F{gxCbiazZ_i=R5y?)|cQ0+iBvVt;sF_A>#Q1IpzP8xBC8 zmkieH^#V|EK|l{cZ%f{Wg&{7y+zq_iyb4q~wGHo@J|uDTTTj zfjIU3{M9PQzf&z)2yAKXE2^JUglz!OE~BdR8>$un9kH-oqou0>2#3xYy~`!wzRh&Q zw{|?E+cLmYB^=V*O)U^B*uHYM#@|xp^%WOLseaDn~&FrU$q$< z)VB^ztf7pvlS5UgDGpw|P6vdp&bZ;xA4WPdBZ>Mi%@|h-b$`_ZQR?U6#X85oLoayATp^O>TxV#NeJ-`dJNPnv_=V}vE_IhE8UOl1EAVq_! zIN34pFL%FcS{u~Y21%=Hf`7TuEL4ZQcvXr^%IG z!b5dzhr}jfEA_mCP>|=x%zr*GjD6bwS+wjwES>;+;XF}3?|q`UzUg){X#Y#%2=l8~w001N+B4;AW5(}Ik0Qr;r(!8DEL$e8h zG*8JTR)Vt0!f2?^?8|mD0ARnH2ph}*ylS>@%?M=1FA{^MJy18z`48W_Cs?TF5_h||NaHvWgd$og|5CK369suwxUofr|>Usd8 z%=g2KRgQngUh)uFo3pQ|evA>;0br_RW$O=A%>bJ5a9o3BiyjD<&Y5}c=YV^eSqy8p zp0{}bGUe8j$}ED#_xn`*1IXM7UgvW_;s9#IlMqRNet*QP%T@3q=v5zpdhH0Vxh;t1 zM_!ui9bg?1%7{^|^IHQo0K7ztbQ%k;b_scJSElGS5DE=awy4UB9rN+}@T;b^L49kH zV)bpD+#ISzZQ|g?n{+_v5`AELN0qvBgtv}ih$DJHI=!R%40k|0is0CyFG5ZL)qM<% zDK2&)(?9GP&^iFVPc-Pxc1jbVUg6tm8o;$m)2!I9?b{517TB3K)2(v){Oj}VFR&5r UJdu$KXaE2J07*qoM6N<$g24g}aR2}S diff --git a/graphics/pokemon/snover/anim_frontf.png b/graphics/pokemon/snover/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..64606881f88c8acd4dc9336a2dcf102158a88c95 GIT binary patch literal 987 zcmV<110?*3P);000AK zNklF>l&H7=|6mLRB_H=-h;`bPHFjQYSaL5G!=S@KqHPYLMXvq(1MV$#w2f zbq*|nF;ko|6Y-DgcRpjzaFD4|D{&+d%J=SRp1Q38qd*%OrHiBIuO#;p`(C?-JSe*lfuJOvxfFKRPDrQLF+8Bgs z#{vt|0BiyflPK^yTL7#p14v6S5(sXn1PXp%0wpY$Z2VIeV-#4Axd~wMz!#IifYK2; zLM8$F0poQ!f;+qka2+LbL?qA@WAs_bsRT^!-rzLLEi4KE1c3A6*TeLI@FBkemSNeEo=Xf(hC9fvb`{m0f2bk`;XQhr3hgFz@@rf7~ZPZ$iB6Ag&D6; zu-?w^>ES6<@i;Y$2w8Znmg{1eWFN?ZW#MqEb;H<|fY>Ymx>`4O38_fHhC|(XJRr3U zXzPGVrBWj@r3$)}k7WdE;@1Ps6pWLkyLeThx(-PC*8seAKsp0hH^i-6!y3ROA7=Bq z9%xPDTVjs^I%Dl~Fz=#xW_M-)(+4eJG@>XPPor_?IT|_ZfCv1UM3LLm5xY^^Mh$l` z)DYA2v_84#*XfDR1;kGYaW{I5T^%rae7>i5*cx&Cq#NSX?3v<6fYL_%Fw&hUlg>Y@ zjreKvm#s;i?Ul4`Tfz7j1jBeqFtPweF!TY6VCVxB!O#aNf}ssi1w$L43WhEqCm5?O zFBrP7uAE@#h@4<(m!SxT4k&z81VdN9s4WCT6X0KvgPZ138 zyGn20XX3i-sDc5X{RO~819+g6J+H`WWD-g3)f_I6*fvTE_7X z%LxYF^uJi(&jUC`tIG)n{V80IC5!2Yl!{9*FBoTNgMqZcLP$LKA1>=m-3^3(AeXaE}wUAd-UI2-KouRCeGTdWx=SxDG*ky;4 zT1U>$-*9m4NAxU9544zK3dqi25+}f4h;Irw ViTQI|U3UNg002ovPDHLkV1l`7_uBvf literal 0 HcmV?d00001 diff --git a/graphics/pokemon/staraptor/anim_frontf.png b/graphics/pokemon/staraptor/anim_frontf.png index 62715651bb0b81726a8800d212fe0f5fc97972da..37e8b5cfe139a18d5b747f5ff77bc09f53bdd5ae 100644 GIT binary patch delta 60 zcmZ3*)xR P7=YlG)t$hNtxH(|t3((^ delta 100 zcmZqTTE#U%C(=MeqaYzdKtLeC!(oMm#)}9C2Lp=<1q~Sy5j!@l`0(OIL4d}O6%hw2 zEEpIVir>yR2U45`9+AZi40_5S%viD1z6>bHUgGKN%Kn^hS&W9(8E0JFUw A_5c6? diff --git a/graphics/pokemon/staravia/anim_frontf.png b/graphics/pokemon/staravia/anim_frontf.png index 8658532ac74d206dd61553617fba98c0d3c942e8..40de79a60864749339cf574cb6842471ed7d368b 100644 GIT binary patch delta 55 zcmeyxeu;g8p-zN=fWVA~jt?I`Y}l}2M*_o-2^tj+3I!1f78VviA{-cC;E0~x*Nv^E F%m99<6r%tD delta 95 zcmcb_{)>HrVTgx-fWU%=h7TV;tk`kjK!U=929E{@iGqj-3j>SE$@vU0kR0^370Bi+ p@Q5sCV9-+rVaAH3_GLgp_7YEDSN7*@?EG9T%6HUtH^!DS0{|*o98CZK diff --git a/graphics/pokemon/staravia/backf.png b/graphics/pokemon/staravia/backf.png index 36e2f2169d51bfa7bbc8602193432ea9bba3dab5..51fec5992db383f7230a982cb44b459afe6cea52 100644 GIT binary patch delta 583 zcmV-N0=WId1)BwsUw;B7NklsSsffNDw2i zUfy3Tjw60f%p}Fz!yi;F`Dg< zo7*D-?YEyYnq=#jK=<_fQpD=(o0mZM;d@NbG>_vI1fV!}mkL%*)401#=#ZdL@20?` z(=h@^z^5w*pMOHorc{9dp{KxJW@vbtooeVmHn#^5t@5n`AS)(gX9@?9ziUT&RT_U0 zJj8~Jq$dIJdIT~IfKLGuM*u-3YjcKYrbP)c{*NeC+h0iNhDK(4HSqN5CwO5}Ou z1iKx?rZyG8w(ATqzzabs`hK{45poiw1FFgaSPv9e8_$qN9w04N3;^qYuJ&%`JRCqx zL+kZ=7(mXGojZC+>6eRu^TXt$lo?K8B=v%FTkBkXoSqIY#fj#za!oHyEf@b&`~~sV VoTV|jtSA5g002ovPDHLkV1h^S28{p! delta 623 zcmV-#0+9Wi1;Yi9Uw;4za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2M-Dhvtv5E z0006eNkl4l z)RUjGq+}`aT_R6iN(6{)e&$b!q`X-C8-wMHA61$1XNV|MfPY14b;6$`mN}Nm3@A#O zQqYt}nMzSFa-B?pfP{izAic<$Z6W|?0X+xcat=^4r9y-`AVG}4dU?NAY{&KI#7>gE zJ=W#jQjm$_fK>ueO11m_9e^c-fYp9`TO$X7KvsO&{JJS(V62ygvdN z2Ec~^i6a1^12pHzRc1ng4S*@bdEf!fiK!UiCZH9s@PB>%$!U4u6-C@cfYxaHdITy5 z@aj2BI|7pY4p1;E@bhb+eg;&}022ThfgGuiH*ITCS)~j-c%a`!z>;fwI9L=$zzC2H z5RPL?Lddo~(d+b+xOV>CHK3I4x|0xA2m(COUw~X$0Yyg@LI$gT#@kdHJ#TC5lV_W!w>-OOn?fSQKt^?Df2lgS-5 zr1a$?;QTQ8C}oC27)iaL+-RMvkJHn^g*eeZR<7x#spaB-vcI+roXI@90g(Uz002ov JPDHLkV1oAK90~vc diff --git a/graphics/pokemon/starly/anim_front.png b/graphics/pokemon/starly/anim_front.png index 0e834f3bd3c84bfa760759e0285385afc3534cb9..b897ef874ac25bdbeb61699a38d18f24a401aee8 100644 GIT binary patch delta 807 zcmV+?1K9kY2l)n&Uw;DxNklzfT)66vuO?42;+TIz&jZ$uBqsi8@<^)C-`N zZdAQ=$^Zg0Acj^d8M;&vLL4LNkgSM-vNeb3VD*nUBv2Rco%%QQ`3`kC+gYiaCnd}K z=Dp`UKYv~>H?e=!99kNqn7&=K)uB8gfu@?ogG*AgES3$2)US=X7rUg+@@T zpQM7gl;^t|fgcV!_{|)DkIFKyTs+5LKo}u{JRwFi*&1^NEJ)4A zBP@hqM04>9ML~~tJwb$sRteP#j-VUjn}`@{>m%?)z!+OWntnM+gnbdMfnPTq&PwY$ z=LZp6Lm<$#8?)B!eyhcr@K zS0=$?cy{r5X)~n8*&Wc*)L?L7c^u$VK0mj=FmAh)o7lwuE5qaNyz>Om9%HM!A@3{! z+)7{tw<5QV%a7c(gm63Dz8v^GjbO~71l{`}6==Yl-+}-gRVU=ofY+q}ZVq32AfOuX zy6EQ#-+!*cQDvN$I`Go@t4=DwdHKM9WV=ego^DqN-$&S=4|HUHMTaM}rpQeYtSMRW z;@`*59?3l$#M!R9%fALM6F;J}T@8}R^6)rF$?k2$n!8KFK1tjdc{jRil|LpZQFv5D zZCx+C8~gzz1lS)nb%NqejnfZ!R0Q_3X*Zjs2!Gh+2c9Sb+gGV(Jt*EPfe=L?E5kTj zr=uc#5()g(VY2^J3)m0KN0Y4-KtQrZ6od-E0RAd~W`GtL91z&v^tBlv2V*T*4uI{x zf&P!|H`D*`c3_;(bUVOx^LX}??ZCVqoGRba^_6KoaA7m3yO&|#Si)kzlncW%^Bba0 lM<6#B$2?E`4wLirRAAqr5v0?xK002ovPDHLkV1oHrc_sh= delta 844 zcmV-S1GD`32A&6yUw;4za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2M-Dtr($OF z00094NklJx?1!5Qcpx7nJN8NO6kf9e=_JB(n~RNU^`dNGY#RmEVxrJCx>j&n;0rl7HRI>vv|oAJ61+llWJ| zg5ns()BAB2(HIMBG)BNkroaY|X60cqipp7ee>;kzX|w;F5GWX#`x8QBT2xT*Aw!@l z#15kj!G45&ngo@O5WY}-8fpM0cR^J#2&z>f=pK_2qayB|-^d#FcV5lkPEBppw-*I;2uc&NK(F;7B;$ zb0w29 zEbNZR9)AuzkvJG@D8cqmKM`oao8Lr(j_MO@XuxX&f?MF%J_>dK&V&nb!2`8gHxy}ax>y@X~0W=pFDXW_pIMY@4CJ8 ztN$|26PVr7Ac-vvPW*)I?s`LWc3IG4ahekMR)2S_@+XYM3KwM9*6oFROOH^(ko{p( zCva|S0*>g=LH6@$J6*&`10XvPEQP6?!RkgS~2bf1=T_$*`itHq@MsTQ&y zhmR(26i~p@O%$Xu;0S+Zpt(RLjtfM#H$80yHAwLm4hP6~&p`hN_M7SdcRDcM&ty8F zbw%^_?8Vc8c|15%xrLi+(|BOxWKg%Sf}XL3`Cc&>1n1^AM6C`s=Epo^WtiaP(Z(P6 WUJx!wcvC$90000ofm4vEvqea~0BY$* z)udAf5SRfmv{K2?rHT;Z7*U60MGTa!IYbAmf5ahyy4>EWe}6-tFR07e&PvrhDYv|D z-h2M>{CSQuv47QERve=!+>Hy7j0xe!V+0gi1&9U2=4Z7eDcSsqvT1YtLMn*O_1(AZ zA!(3+<{NWBq*1KAUktV=(Mx`LL;bDPey{c zm=n7iK@j%a4`a7)K-NLndC?>ng>fj6RcDo-jCJ(Tb%&FIs-s{V* z3V=y@FDpO^TX?(i4*n0u4wJj=RlzfOWOB$lnv3TK^O#^vu`lItCR?MECz4hIG9*$; zPBj-V?@4yF>q{zSv`U#)a0I6zzsZQ>rapp51)TF0tbaK#H;u3_qc!mBn!{abd>7&% z;%gWLy5lCial7AW@H%XTwtL)p$R0(UQ%v;jhm->Bx$%uaRQa36?wvZlVC#%sUzr4p z;n~IKrOl8Td$-SuQ~myh<#B*t>HOUO!k}i+nb^esD`$;_RuTIah&6YYhCQ0P3HEPv*D7~RajNi{ zjGDT$@NdWmkWgTMRM!c-n~Go`$j}4!^J$b#;sJKWfiFE^`zq6n2i~m`Na+DtIU(6P zT@~SzOyREIm>>A={Zqv?QD&F$GsrvvkNaH@Pu*H@U|<*+Ah@uo`1ttX*wA=L81R5NuvjRVfPipVSa4uq zkYH#40037(y%GQb010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE43LQtckL>^e z0`^HnK~z}7?Up@H8$l3;eJdA~>>iN9jd#x2hLe!aYfvONIe!C6NJktyHD60X6{O&T zCbAIXC{YT#MHGZCK17QBL#gr`GJ8g8Zg<@h#UuHec|EfqGy6=TFtdNvJSb05_>E~H z#FP+TG)2IvQ$QeQExiy{Bipe{vQnvL?d4+ zbb(GxjiF;GJTDF?qmYXWGi`kedr35z=o_}9baCR6fu2d>G7zJl|8|nx8 zY1o9H(+hZnVeN_mosO^O23bu-a=I&QT@6OY2!Jsx(ANK+v= zW#;xHL00vmVSOVA*Z#J(d*`lhVGH2l-X>T{u5Z7t?j&IC-653chQnLO5#vkW z(F24Q7{FWHMfCUd0D(CS;3a_ImiReB0T{qb=<7?lSLL|Ss3=U}1^>P`5wN1zkZJx_ z;rrFzGMC4c#eUaB=65i9Ho^l#NTselbt- zNlJ)ac@nA;vONOBcu;!M0;NhwR>4?)ot} z;cTx17#b)LxItulGd5<>gOq6DaDZ%&E%bk8zn%Vnrvqz$PNoA^x3}jYn-1*b!Ik!{ zKHS^J1A>!5o!lh@>k?K5vC-DIT#@N?-=*&))s}6YymiVOynoz}_fHS(dC$=l9WiNr z_h-!zRQ=C}>(Uw3RbY94L*Aw4Z2Ek_CtX^G8nT*n8oUv(U(*!ZgYQPr+X1~Y3($yF< zhB1)DWD92IT*~)`rRh&ZBoiP;SnJ_+3Cvk3Fq_)nNq-&W761Vh0`a0`wH2HEO1_PO zrQc~4LZpYloG%s@ya7Q2ruH3IUcJVk0B94Cz~vtBb?{@65wKgLPqu{JChaj^EH29o zWe^B=FCmy-!WdVg0?WZJ@J6&<3*es^>>cC@C1;d3-UzmT3`4N{TMe7Ob}>jMis>Uq r0?)@PN+Q7y4{ll)EPVdg`v374L%`7v!xDSn00000NkvXXu0mjfU<3lW delta 591 zcmV-V0e4Kcntyg-K|;q|33O5?#5X`J z@C~YtpiX8<pP)c}xEw2c}8mlN$4O4_(~3V&9BiPnxjA}$00(bMmpLvSttp!c!s zm_gWQiZ_eK7Jr}$eq%m0SE%B~fSI-cZf;NeVbe8Kpl5Dho&EUYZlO;Z&VGIi8iv?_ zsQ>W&ZRi3$W8m)LKAO4!H^$t34V^s#5HR=d9&Hom^I?K?v=tMx*a4m5%uRRh`l%?aG&2yV3NLXG2z9KL?AAkSN)?>^WCO{I?Etts*tv^VX zWq%NnOn?|+t%sK-kgrRD`P}|a>marO2%u7kmnEyMSjN}-T>>ooO{-8UI|TA#xwPOM z6b+c!cU*h*8iN9$O+W%yd%zdL<1!~;w?v<81-nh!W4v5ml^Mz)5bj<=Fu#H^u2ltA zgI(Z_Xh^#jz>^s49pnimXOuVD2)2I=L$Lc>51YPrF-We8=_5x1&&MiC!43~@UKcEU d{@42d@eeaQu!IczQ*{6U002ovPDHLkV1klA4cGtx diff --git a/graphics/pokemon/starly/backf.png b/graphics/pokemon/starly/backf.png index 3851350df0c515475de75c32304a63b73abce968..f1c45a7bc69c3fc40efb99eed736f7c11e354813 100644 GIT binary patch delta 547 zcmV+;0^I%e1j+=EGJm9VQaBhG*vO#x`1s)9$e3Ut_`o30m;k_-fS_ftwEQ#8Kl^7f3hXQd8q}-^IJOLV;e{oO}bz{qp|xC4U&kf8<4pbqe3h11L`5 zh#d)NSe#&wM!P_`s{};Fq5(95N>L2}A;O|jZJ)}@4LQQ69 zJ>Hu+Lo9(^dw+fsmJU=ohw1ao?&tvJoKNp8ZI1vF@R`0x)dauUPT)3I;)@U0Kq)>m z7wi>*EGX@J!-~OPNC4(?-6UJx^E|idyX}DV1C_>fNRR<#Cc)sd{oya#7!Y(oN_1CX zAiAD+A&Bq4Bce1WqK%mzjuRk`5`jTq{dTe-QUD}C#(xld3CpZlL}TyF0ph>PRWRmn z1JNCg6gUAU2lUlDE{trAdJIq{kOJo$pd6ZSqd)?+CHcwbu->FP#@^^O$&iEu*7_xw z{ZnY;f~8L74?mS+>^Nkk8 zwBI1g*s7DefV}m6sJycsFyJ#=r@VpXetQ4>Bs}je>Y}B_jqmLVG$)AVo&;PpCph5I zJ|Om$fT&pvfJe}2ssSLSXc{#HE~Rt}CG*hWTx0<*wWE)a3qkLqt8bh`a4rC#d)sl$ zAnY^6$60L)P=5x$GGFQ|lyPOij2i$qcSpUT?ixzaHFw7+KfbwJ=uw7~pAUY`5GxS& zo*zF2F3>dw?w_B+u?uix%>DPk*&_e}^W^T)HetT*CP;>B@xjbCKr2791j03eDrg<* zS;teqSO)%T-K<(&Yn=?!WR$UKX4CjF%POF)2uw~#|9{fu2s4H;ki=vSCh|<{&yuC- zUqmG1BZgS%;avgb`$AwgwZG#kh%5jCs1)LP!73}3(WSnQfu+A`6-uSMK%UL#7My~j z0aN>qORrj^p98cBNZ?`%w1xj?o)NHHqEEJf%_i+Jp3g6e3`GzKHZQ@SUcd;KssxMv zCh&%|T}KPxRrI$G@_>>v${Vi)+dhT?*!?XBbzeIlBvbkHp(BCU#xe@Qb`Ne^6)brB c*ZTkQ0>Zzr8dTNh(f|Me07*qoM6N<$f*&9c(EtDd diff --git a/graphics/pokemon/starly/shiny.pal b/graphics/pokemon/starly/shiny.pal index f077f7974..c49fb7aed 100644 --- a/graphics/pokemon/starly/shiny.pal +++ b/graphics/pokemon/starly/shiny.pal @@ -4,7 +4,7 @@ JASC-PAL 152 208 160 96 64 48 16 16 16 -136 104 80 +164 115 82 56 24 24 216 200 160 248 248 248 @@ -14,6 +14,6 @@ JASC-PAL 208 152 0 192 152 128 160 112 80 -112 96 96 +139 98 74 247 82 66 0 0 0 diff --git a/graphics/pokemon/swalot/anim_frontf.png b/graphics/pokemon/swalot/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..da17817ece8f61d09a06ee4952097be98c7d51e3 GIT binary patch literal 1108 zcmV-a1grarP)ziZq`6vw@Vg3Cy2lhSAuB?n3tG%td{R=M5u>yf8Oj=TRMXJ*W1KJ8TU{ePo^)}qF0enyf{m3r^F?7Wr zjXo-`#70~K8}aQy3_guc6<~)hpH|pGz=x1T(|Qw(K?;2duq426NXVpK!wJI_X8+3j zCkz-)olKM(e1yP4rr;s}h*Kw%iF%{k{Vcl>KtG$#&kcZsfJ|{8f%%C5PE}x*Wtr$= zCIFElQd3CaLR1jIoQS2S_&bv|`q^S$0%T+WU^c<{Spg_V`d85dj<9G!tooDbM6>J! zwNtH;J+1nSg=J+Jym&K4B&b2q=9}@B!(EJWMd?Y&w z#Sgbg2F_C^=T^~iT4KM~x2=xbqVD2rhF_Yv#Uglx^t$%=QhO~`I$zQMnn5t9kPhSf z>c1<7)S~~L;lK}8`fmgj!D#BgrYHu30Mrjw`riQdU3V+@TJ---lIQuCmHz9%`g;ld zQR%-K$kR&yb!|S}7r^d+mHzAMez+g!`85JhEWnY2z%Bxn{*N^IN8nllrT%M!c!|KS z04n|0CshHqSv&r<0#FU;q+1BQ2%u{LyaIr@Jap|-*(repwO?2Pa$nUvchKF+B@lQ+ z=*E<&{-E=?06wGqdqdi#UIPexKfiu~GfEiHlrplID)$(&Z5;I%c?dy5&>u_`hq1;u zhb=s8@#J$Z4TdJ&JWbK22(Q&&%(*ZaiUq-yG8_&Q+Psj`tJ{OM^faKGP^$Zh0Mr^V z+vGyLXA(GT`Uf-)(m+UqQOLhi!-=w`fmlq9{=p%$rGc2p78?G6k!WQg&J6wm0bwA7 zY)_5;0sk!x1hM#sm4WzS{R69n-{K#zNbj=EKRB0!vsV9rJ7lZ8%|CE4yH@|e`RJ$A a>i+?=U?JBhT^9iW0000rfKX6SFfcG^XlOuSn3*?r-T&|50005e zNklq?`_NL6tIK{fVN#II|WdE4h}G|0!jeeN7E@a z?oclUI)99P2dx{7GeGB!_X;TO@s3r)tVgFh?SNaCmlFEpK)p%twv2^a^D95vPX{4- UZqPjh?*IS*07*qoM6N<$g5W&z$N&HU literal 0 HcmV?d00001 diff --git a/graphics/pokemon/toxicroak/anim_frontf.png b/graphics/pokemon/toxicroak/anim_frontf.png new file mode 100644 index 0000000000000000000000000000000000000000..40f86c45eccaaa26909bf5906cae5304e72b3172 GIT binary patch literal 1266 zcmVOP*|8aIIyt5`1trZI8gYQpm=zQwaG~S000Di zNklzl+>P6vx*CY7Pt;DQZFtnh`2?;V{y(3a8!u16ERA5+?x{#(zQ}b(*A& zj0>sDx>`YsT)PJ$7+1T^U4Q>VinKOd-poka)vmN^6YvzbC-l*q_iN^TCzJordhp2z zz`_xN!3e=%gm~bL5k3$hMu4+~2F?+DZU}G4$@zj_$1fln06tw15PzLP7%T^XIlN4N zNdSbq?9CGy_~xgdF@uP^1BpcZ@drc)B=0d{WiDcZ2rkAbdm@=47Qa#$PXRGo^hC0H z{Y*}aS5IG&i6;w?r&~<(>nmC0KE$|K%zM)1Ute#xlJczpfK!0+?T)Kl$M}Sj-s8nx z$g4^fgHi!~CML6@C`#G`Q&rgb6j&2bKumBbKru_)p8K|h$VG5-E7#Ew2c ze&-Zr8n+;PzT3Ss)$|W*${hVb7~VI4(*Y{=U?~Uxy#Ggag>8jj{2ng%NqR%|RY3H9 zb7cTN%Wv8vG%b8^Cy4_gm+v>U6Sot0nu``#mp(ltD$iU>L7WDx=8RoXqfm`CKu5x& zADac!ob7=XPgR<^tB(xT{C2`VD?Hiu!llk*z*9@*i{0GWlUuuNqr50Dg)+v3o#^y3 z!7p7|?Grg$vHJK3lmCaDLY%GkwKSVaY6h&U&)p^Ko?#0m-4AtrSY6%2mDt7WuU?q0 zm=KF6z_ao}o&jIwcdRL-=90P{*MXO;Ta+l{d z%zy&fYZ!=xdq%^M03l*|M#Er2qp0WHH5w+Pn}w`I-k^pdiIUK6(XfVz@ykAivDYv_ zz+CB!<$#8vJr-c3NWX@m>1OJ7R2TO7cK1j9CCyG-N(j3*<=ytL`b$K8KlzB=;?wA^ z)E1;4)NrTK>qIB=K+6a2>T8-Ei6tXZw0_`bb3g7lG1GvSD2|!?f!V5w;@iDMse!H& z!qyU{wvaXj^bX|1Oc}_LW+Rwc!8*g6f>#p7qgmuo;nNzhn~G$VHm33;RkE{23s4I; z`l8-WqDrMXL77tl-vioV3Ah7DKtCq-`jXr2sfi5de%S3Y12DS~x3!nEHyWTf@$(NF zP}5HqP4}{O88*Oo_xFAcu%d~Q6?sffTAYN#A(fo6)A40p;4{5J{NW4}*$X@**NA!dI cs2_&bzZyP*Hh!co=Kufz07*qoM6N<$g8I8*7XSbN literal 0 HcmV?d00001 diff --git a/graphics/pokemon/toxicroak/backf.png b/graphics/pokemon/toxicroak/backf.png new file mode 100644 index 0000000000000000000000000000000000000000..dde6b0be22486ed80849b3a90675dc77cd8d2f98 GIT binary patch literal 622 zcmV-!0+IcRP)eXsD<_c%Y!r`1trZI8gYo;9zK&x2b|U0005` zNkl5d{2)>`sXPl;0uF`DPk8Ja9E80m``nR%BY=Ol%^IE34lEWcI32z6FHL8}t>B_yD=( z;Ewlq99T39)Lpf{&hgR(AY=UHdWpYX;5$6{K*%?%lhF&<(&mc?e3A*W0EX@7%mczo z7HDO4__obDClev9HWt9p;IBUbEU-A}B(2Q+t_EnpR^wDV0B$MBYr{lq0ILiplQ55r)A Date: Wed, 19 Jul 2023 02:46:57 -0400 Subject: [PATCH 058/111] Fixed enemy parties not reverting to their original form post-battle (#3150) --- include/battle.h | 2 +- src/battle_main.c | 3 ++- src/battle_script_commands.c | 2 +- src/battle_util.c | 8 ++++---- src/pokemon.c | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/battle.h b/include/battle.h index 0219ebd72..b27062c12 100644 --- a/include/battle.h +++ b/include/battle.h @@ -636,7 +636,7 @@ struct BattleStruct bool8 friskedAbility; // If identifies two mons, show the ability pop-up only once. u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. u16 moveEffect2; // For Knock Off - u16 changedSpecies[PARTY_SIZE]; // For Zygarde or future forms when multiple mons can change into the same pokemon. + u16 changedSpecies[NUM_BATTLE_SIDES][PARTY_SIZE]; // For forms when multiple mons can change into the same pokemon. u8 quickClawBattlerId; struct LostItem itemLost[PARTY_SIZE]; // Player's team that had items consumed or stolen (two bytes per party member) u8 blunderPolicy:1; // should blunder policy activate diff --git a/src/battle_main.c b/src/battle_main.c index 3e19f247e..f6d822e3f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5434,7 +5434,8 @@ static void HandleEndTurn_FinishBattle(void) changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE); // Clear original species field - gBattleStruct->changedSpecies[i] = SPECIES_NONE; + gBattleStruct->changedSpecies[B_SIDE_PLAYER][i] = SPECIES_NONE; + gBattleStruct->changedSpecies[B_SIDE_OPPONENT][i] = SPECIES_NONE; #if B_RECALCULATE_STATS >= GEN_5 // Recalculate the stats of every party member before the end diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 74e13b6d8..bc85f371c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10669,7 +10669,7 @@ static void Cmd_various(void) { gBattleStruct->battleBondTransformed[GET_BATTLER_SIDE2(gBattlerAttacker)] |= gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species); - gBattleStruct->changedSpecies[gBattlerPartyIndexes[gBattlerAttacker]] = gBattleMons[gBattlerAttacker].species; + gBattleStruct->changedSpecies[GET_BATTLER_SIDE2(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = gBattleMons[gBattlerAttacker].species; gBattleMons[gBattlerAttacker].species = SPECIES_GRENINJA_ASH; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker; diff --git a/src/battle_util.c b/src/battle_util.c index 495f26cd5..baa365a0e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10227,8 +10227,8 @@ bool32 TryBattleFormChange(u8 battlerId, u16 method) if (targetSpecies != SPECIES_NONE) { // Saves the original species on the first form change for the player. - if (side == B_SIDE_PLAYER && gBattleStruct->changedSpecies[monId] == SPECIES_NONE) - gBattleStruct->changedSpecies[monId] = gBattleMons[battlerId].species; + if (gBattleStruct->changedSpecies[side][monId] == SPECIES_NONE) + gBattleStruct->changedSpecies[side][monId] = gBattleMons[battlerId].species; TryToSetBattleFormChangeMoves(&party[monId], method); SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); @@ -10236,7 +10236,7 @@ bool32 TryBattleFormChange(u8 battlerId, u16 method) RecalcBattlerStats(battlerId, &party[monId]); return TRUE; } - else if (gBattleStruct->changedSpecies[monId] != SPECIES_NONE) + else if (gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE) { bool8 restoreSpecies = FALSE; @@ -10252,7 +10252,7 @@ bool32 TryBattleFormChange(u8 battlerId, u16 method) { // Reverts the original species TryToSetBattleFormChangeMoves(&party[monId], method); - SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[monId]); + SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[side][monId]); RecalcBattlerStats(battlerId, &party[monId]); return TRUE; } diff --git a/src/pokemon.c b/src/pokemon.c index 6d5b3d35e..b06abb6b5 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8507,7 +8507,7 @@ bool32 TryFormChange(u32 monId, u32 side, u16 method) targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); if (targetSpecies == SPECIES_NONE && gBattleStruct != NULL) - targetSpecies = gBattleStruct->changedSpecies[monId]; + targetSpecies = gBattleStruct->changedSpecies[side][monId]; if (targetSpecies != SPECIES_NONE) { From 34beb3d662252ab309a094a224f4414e7771cabf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 19 Jul 2023 10:59:36 +0200 Subject: [PATCH 059/111] add tests for rattled --- test/ability_rattled.c | 93 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 test/ability_rattled.c diff --git a/test/ability_rattled.c b/test/ability_rattled.c new file mode 100644 index 000000000..bddc88751 --- /dev/null +++ b/test/ability_rattled.c @@ -0,0 +1,93 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_FURY_CUTTER].type == TYPE_BUG); + ASSUME(gBattleMoves[MOVE_FURY_CUTTER].power != 0); + ASSUME(gBattleMoves[MOVE_FEINT_ATTACK].type == TYPE_DARK); + ASSUME(gBattleMoves[MOVE_FEINT_ATTACK].power != 0); + ASSUME(gBattleMoves[MOVE_SHADOW_PUNCH].type == TYPE_GHOST); + ASSUME(gBattleMoves[MOVE_SHADOW_PUNCH].power != 0); + ASSUME(gBattleMoves[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gBattleMoves[MOVE_TACKLE].power != 0); +} + +SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when hit by Bug, Dark or Ghost type move") +{ + u16 move; + PARAMETRIZE { move = MOVE_FURY_CUTTER; } + PARAMETRIZE { move = MOVE_FEINT_ATTACK; } + PARAMETRIZE { move = MOVE_SHADOW_PUNCH; } + PARAMETRIZE { move = MOVE_TACKLE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {Speed(42) ;} + OPPONENT(SPECIES_SUDOWOODO) {Speed(40); Ability(ABILITY_RATTLED);} + } WHEN { + TURN { MOVE(player, move); } + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + if (move != MOVE_TACKLE) { + ABILITY_POPUP(opponent, ABILITY_RATTLED); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Sudowoodo's Speed rose!"); + } + MESSAGE("Foe Sudowoodo used Celebrate!"); + // Sudowoodo is now faster + if (move != MOVE_TACKLE){ + MESSAGE("Foe Sudowoodo used Celebrate!"); + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_RATTLED); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Sudowoodo's Speed rose!"); + } + else { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + MESSAGE("Foe Sudowoodo used Celebrate!"); + } + } +} + +SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate") +{ + GIVEN { + ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); + PLAYER(SPECIES_GYARADOS) {Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Gyarados's Intimidate cuts Foe Sudowoodo's attack!"); + ABILITY_POPUP(opponent, ABILITY_RATTLED); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Sudowoodo's Speed rose!"); + } +} + +SINGLE_BATTLE_TEST("Rattled triggers correctly when hit by U-Turn") // Specific test here, because of #3124 +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); + ASSUME(gBattleMoves[MOVE_U_TURN].type == TYPE_BUG); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } + OPPONENT(SPECIES_SUDOWOODO); + } WHEN { + TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet used U-Turn!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_RATTLED); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Sudowoodo's Speed rose!"); + MESSAGE("Go! Wynaut!"); + } +} From 6b5d1e7577eb7249f37f74aace054f7729ffe58d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 19 Jul 2023 13:25:20 +0200 Subject: [PATCH 060/111] Adds some gen9 moves (#3147) * Adds some gen9 moves * Fix Test + Tabs * Collision Course boost changed to 1.3333 --- data/battle_scripts_1.s | 286 +++++------------------- include/constants/battle_move_effects.h | 5 +- src/battle_ai_main.c | 4 +- src/battle_ai_util.c | 1 + src/battle_util.c | 4 + src/data/battle_moves.h | 10 +- test/move_effect_collision_course.c | 47 ++++ test/move_effect_make_it_rain.c | 34 +++ test/move_effect_spin_out.c | 21 ++ 9 files changed, 169 insertions(+), 243 deletions(-) create mode 100644 test/move_effect_collision_course.c create mode 100644 test/move_effect_make_it_rain.c create mode 100644 test/move_effect_spin_out.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2b747c329..3c0950dc3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -432,6 +432,22 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectInfernalParade @ EFFECT_INFERNAL_PARADE .4byte BattleScript_EffectTakeHeart @ EFFECT_TAKE_HEART .4byte BattleScript_EffectAxeKick @ EFFECT_AXE_KICK + .4byte BattleScript_EffectHit @ EFFECT_COLLISION_COURSE + .4byte BattleScript_EffectSpinOut @ EFFECT_SPIN_OUT + .4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN + +BattleScript_EffectMakeItRain: + setmoveeffect MOVE_EFFECT_PAYDAY + call BattleScript_EffectHit_Ret + seteffectwithchance + tryfaintmon BS_TARGET + setmoveeffect MOVE_EFFECT_SP_ATK_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + seteffectprimary + goto BattleScript_MoveEnd + +BattleScript_EffectSpinOut:: + setmoveeffect MOVE_EFFECT_SPD_MINUS_2 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit BattleScript_EffectAxeKick:: setmoveeffect MOVE_EFFECT_CONFUSION @@ -1121,24 +1137,7 @@ BattleScript_HyperspaceFuryRemoveProtect:: return BattleScript_EffectPlasmaFists: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret seteffectwithchance tryfaintmon BS_TARGET applyplasmafists @@ -1147,24 +1146,7 @@ BattleScript_EffectPlasmaFists: goto BattleScript_MoveEnd BattleScript_EffectSparklySwirl: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET healpartystatus waitstate @@ -1173,24 +1155,7 @@ BattleScript_EffectSparklySwirl: goto BattleScript_MoveEnd BattleScript_EffectFreezyFrost: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET normalisebuffs printstring STRINGID_STATCHANGESGONE @@ -1199,24 +1164,7 @@ BattleScript_EffectFreezyFrost: BattleScript_EffectSappySeed: jumpifstatus3 BS_TARGET, STATUS3_LEECHSEED, BattleScript_EffectHit - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET jumpifhasnohp BS_TARGET, BattleScript_MoveEnd setseeded @@ -1226,24 +1174,7 @@ BattleScript_EffectSappySeed: BattleScript_EffectBaddyBad: jumpifsideaffecting BS_ATTACKER, SIDE_STATUS_REFLECT, BattleScript_EffectHit - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET setreflect printfromtable gReflectLightScreenSafeguardStringIds @@ -1252,24 +1183,7 @@ BattleScript_EffectBaddyBad: BattleScript_EffectGlitzyGlow: jumpifsideaffecting BS_ATTACKER, SIDE_STATUS_LIGHTSCREEN, BattleScript_EffectHit - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET setlightscreen printfromtable gReflectLightScreenSafeguardStringIds @@ -1430,24 +1344,7 @@ BattleScript_NoMoveEffect: BattleScript_EffectRelicSong: setmoveeffect MOVE_EFFECT_RELIC_SONG | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret seteffectwithchance argumentstatuseffect tryfaintmon BS_TARGET @@ -2214,24 +2111,7 @@ BattleScript_EffectFinalGambit: goto BattleScript_MoveEnd BattleScript_EffectHitSwitchTarget: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET moveendall jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut @@ -3191,24 +3071,7 @@ BattleScript_EffectThroatChop: goto BattleScript_EffectHit BattleScript_EffectHitEscape: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret jumpifmovehadnoeffect BattleScript_MoveEnd jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd seteffectwithchance @@ -3280,6 +3143,27 @@ BattleScript_MoveEnd:: moveendall end +BattleScript_EffectHit_Ret:: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + return + BattleScript_EffectNaturalGift: attackcanceler attackstring @@ -3471,24 +3355,7 @@ BattleScript_EffectPoisonHit: goto BattleScript_EffectHit BattleScript_EffectAbsorb:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_AbsorbHealBlock setdrainedhp manipulatedamage DMG_BIG_ROOT @@ -3917,24 +3784,7 @@ BattleScript_EffectFlinchHit:: BattleScript_EffectFlinchStatus: setmoveeffect MOVE_EFFECT_FLINCH - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret seteffectwithchance argumentstatuseffect tryfaintmon BS_TARGET @@ -5167,24 +5017,7 @@ BattleScript_EffectBatonPass:: BattleScript_EffectRapidSpin:: .if B_SPEED_BUFFING_RAPID_SPIN == GEN_8 - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN seteffectwithchance @@ -9023,7 +8856,7 @@ BattleScript_BadDreams_ShowPopUp: goto BattleScript_BadDreams_DmgAfterPopUp BattleScript_BadDreams_HidePopUp: destroyabilitypopup - tryfaintmon BS_TARGET + tryfaintmon BS_TARGET goto BattleScript_BadDreamsIncrement BattleScript_TookAttack:: @@ -10301,24 +10134,7 @@ BattleScript_ExtremeEvoboostEnd:: goto BattleScript_MoveEnd BattleScript_EffectHitSetRemoveTerrain: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + call BattleScript_EffectHit_Ret setterrain BattleScript_TryFaint playanimation BS_ATTACKER, B_ANIM_RESTORE_BG printfromtable gTerrainStringIds diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index c10f6d942..bb38d8659 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -409,7 +409,10 @@ #define EFFECT_INFERNAL_PARADE 403 #define EFFECT_TAKE_HEART 404 #define EFFECT_AXE_KICK 405 +#define EFFECT_COLLISION_COURSE 406 +#define EFFECT_SPIN_OUT 407 +#define EFFECT_MAKE_IT_RAIN 408 -#define NUM_BATTLE_MOVE_EFFECTS 406 +#define NUM_BATTLE_MOVE_EFFECTS 409 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 290b713b6..9243bacb9 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4389,8 +4389,9 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) break; case EFFECT_SUPERPOWER: case EFFECT_OVERHEAT: + case EFFECT_MAKE_IT_RAIN: if (AI_DATA->abilities[battlerAtk] == ABILITY_CONTRARY) - score += 10; + score += 3; break; case EFFECT_MAGIC_COAT: if (IS_MOVE_STATUS(predictedMove) && AI_GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH)) @@ -5197,7 +5198,6 @@ static s16 AI_HPAware(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_ROOST: case EFFECT_MEMENTO: case EFFECT_GRUDGE: - case EFFECT_OVERHEAT: score -= 2; break; default: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3e8c5ae87..c18209314 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -378,6 +378,7 @@ static const u16 sIgnoredPowerfulMoveEffects[] = EFFECT_ERUPTION, EFFECT_OVERHEAT, EFFECT_MIND_BLOWN, + EFFECT_MAKE_IT_RAIN, IGNORED_MOVES_END }; diff --git a/src/battle_util.c b/src/battle_util.c index 0f1613cb9..e7687b6aa 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9484,6 +9484,10 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.5)); } + // Collision Course, Electro Drift + if (gBattleMoves[move].effect == EFFECT_COLLISION_COURSE && typeEffectivenessModifier >= UQ_4_12(2.0)) + finalModifier = uq4_12_multiply(finalModifier, UQ_4_12(1.3333)); + // reflect, light screen, aurora veil if (((gSideStatuses[defSide] & SIDE_STATUS_REFLECT && IS_MOVE_PHYSICAL(move)) || (gSideStatuses[defSide] & SIDE_STATUS_LIGHTSCREEN && IS_MOVE_SPECIAL(move)) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 00082d6ec..bb1db2f7d 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -13137,7 +13137,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_SPIN_OUT] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_SPIN_OUT + .effect = EFFECT_SPIN_OUT, .power = 100, .type = TYPE_STEEL, .accuracy = 100, @@ -13371,12 +13371,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_MAKE_IT_RAIN] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_MAKE_IT_RAIN + .effect = EFFECT_MAKE_IT_RAIN, .power = 120, .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .split = SPLIT_SPECIAL, @@ -13401,7 +13401,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_COLLISION_COURSE] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_COLLISION_COURSE + .effect = EFFECT_COLLISION_COURSE, .power = 100, .type = TYPE_FIGHTING, .accuracy = 100, @@ -13417,7 +13417,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_ELECTRO_DRIFT] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_COLLISION_COURSE + .effect = EFFECT_COLLISION_COURSE, .power = 100, .type = TYPE_ELECTRIC, .accuracy = 100, diff --git a/test/move_effect_collision_course.c b/test/move_effect_collision_course.c new file mode 100644 index 000000000..bcf3cdd72 --- /dev/null +++ b/test/move_effect_collision_course.c @@ -0,0 +1,47 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_COLLISION_COURSE].effect == EFFECT_COLLISION_COURSE); +} + +SINGLE_BATTLE_TEST("Collision Course damage is increased by 33 Percent if super effective", s16 damage) +{ + u32 move; + + PARAMETRIZE { move = MOVE_HAMMER_ARM; } + PARAMETRIZE { move = MOVE_COLLISION_COURSE; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KANGASKHAN); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.3333), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Collision Course does normal damage if not super effective", s16 damage) +{ + u32 move; + + PARAMETRIZE { move = MOVE_HAMMER_ARM; } + PARAMETRIZE { move = MOVE_COLLISION_COURSE; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} diff --git a/test/move_effect_make_it_rain.c b/test/move_effect_make_it_rain.c new file mode 100644 index 000000000..ae8149b19 --- /dev/null +++ b/test/move_effect_make_it_rain.c @@ -0,0 +1,34 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_MAKE_IT_RAIN].effect == EFFECT_MAKE_IT_RAIN); +} + +SINGLE_BATTLE_TEST("Make It Rain lowers special attack by one stage") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MAKE_IT_RAIN); } + TURN { MOVE(player, MOVE_MAKE_IT_RAIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAKE_IT_RAIN, player); + HP_BAR(opponent, captureDamage: &damage[0]); + MESSAGE("Coins scattered everywhere!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Sp. Atk fell!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAKE_IT_RAIN, player); + HP_BAR(opponent, captureDamage: &damage[1]); + MESSAGE("Coins scattered everywhere!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Sp. Atk fell!"); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(0.66), damage[1]); + } +} diff --git a/test/move_effect_spin_out.c b/test/move_effect_spin_out.c new file mode 100644 index 000000000..060f3545e --- /dev/null +++ b/test/move_effect_spin_out.c @@ -0,0 +1,21 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_SPIN_OUT].effect == EFFECT_SPIN_OUT); +} + +SINGLE_BATTLE_TEST("Spin Out lowers speed by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPIN_OUT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIN_OUT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed harshly fell!"); + } +} From 7fa6ed8b05d794b1e2656849d1631230cc8084fa Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 19 Jul 2023 17:33:28 +0200 Subject: [PATCH 061/111] Fix priortiy typos --- include/pokeball.h | 2 +- src/pokeball.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/pokeball.h b/include/pokeball.h index 1149791b8..2f003c407 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -34,7 +34,7 @@ extern const struct SpriteTemplate gBallSpriteTemplates[]; #define POKEBALL_OPPONENT_SENDOUT 0xFE u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow); -void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes, u16 species); +void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriority, u8 delay, u32 fadePalettes, u16 species); u8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes); void StartHealthboxSlideIn(u8 battler); void DoHitAnimHealthboxEffect(u8 battler); diff --git a/src/pokeball.c b/src/pokeball.c index 2633fd574..22d973381 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -1028,13 +1028,13 @@ static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 spritePalNum, u #define sTrigIdx data[7] // Pokeball in Birch intro, and when receiving via trade -void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes, u16 species) +void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriority, u8 delay, u32 fadePalettes, u16 species) { u8 spriteId; LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]); - spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriortiy); + spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriority); gSprites[spriteId].sMonSpriteId = monSpriteId; gSprites[spriteId].sFinalMonX = gSprites[monSpriteId].x; From 2860ac9c809be439acdb5b7bb5168bc85277b2f5 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 19 Jul 2023 13:29:36 -0300 Subject: [PATCH 062/111] Added a debug feature to hatch eggs --- data/scripts/debug.inc | 31 +++++++++++++++++++++++++++++++ src/debug.c | 10 ++++++++++ 2 files changed, 41 insertions(+) diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index d7f486907..64b7e1dd0 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -112,4 +112,35 @@ Debug_SaveBlock2Size:: Debug_PokemonStorageSize:: .string "{PKMN}Storage size: {STR_VAR_1}/{STR_VAR_2}.$" +Debug_HatchAnEgg:: + lockall + getpartysize + goto_if_eq VAR_RESULT, 0, Debug_HatchAnEgg_NoPokemon + special ChoosePartyMon + waitstate + goto_if_ge VAR_0x8004, PARTY_SIZE, Debug_HatchAnEgg_End + specialvar VAR_RESULT, ScriptGetPartyMonSpecies + goto_if_ne VAR_RESULT, SPECIES_EGG, DebugScript_HatchAnEgg_CantForceHatch + special EggHatch + waitstate +Debug_HatchAnEgg_End:: + releaseall + end + +Debug_HatchAnEgg_NoPokemon:: + msgbox DebugScript_HatchAnEgg_Text_EmptyParty, MSGBOX_DEFAULT + releaseall + end + +DebugScript_HatchAnEgg_CantForceHatch:: + msgbox DebugScript_HatchAnEgg_Text_NotAnEgg, MSGBOX_DEFAULT + releaseall + end + +DebugScript_HatchAnEgg_Text_EmptyParty:: + .string "You have no PokΓ©mon nor Eggs.$" + +DebugScript_HatchAnEgg_Text_NotAnEgg:: + .string "That's not a PokΓ©mon Egg.$" + .endif diff --git a/src/debug.c b/src/debug.c index ffacba9da..141fbf49a 100644 --- a/src/debug.c +++ b/src/debug.c @@ -91,6 +91,7 @@ enum { // Util DEBUG_UTIL_MENU_ITEM_TRAINER_ID, DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES, DEBUG_UTIL_MENU_ITEM_CHEAT, + DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG, }; enum { // Scripts DEBUG_UTIL_MENU_ITEM_SCRIPT_1, @@ -312,6 +313,7 @@ static void DebugAction_Util_Trainer_Gender(u8 taskId); static void DebugAction_Util_Trainer_Id(u8 taskId); static void DebugAction_Util_Clear_Boxes(u8 taskId); static void DebugAction_Util_CheatStart(u8 taskId); +static void DebugAction_Util_HatchAnEgg(u8 taskId); static void DebugAction_FlagsVars_Flags(u8 taskId); static void DebugAction_FlagsVars_FlagsSelect(u8 taskId); @@ -381,6 +383,7 @@ extern u8 Debug_Script_8[]; extern u8 Debug_ShowFieldMessageStringVar4[]; extern u8 Debug_CheatStart[]; +extern u8 Debug_HatchAnEgg[]; extern u8 PlayersHouse_2F_EventScript_SetWallClock[]; extern u8 PlayersHouse_2F_EventScript_CheckWallClock[]; extern u8 Debug_CheckSaveBlock[]; @@ -436,6 +439,7 @@ static const u8 sDebugText_Util_Trainer_Gender[] = _("Toggle T. Gender" static const u8 sDebugText_Util_Trainer_Id[] = _("New Trainer Id"); static const u8 sDebugText_Util_Clear_Boxes[] = _("Clear Storage Boxes"); static const u8 sDebugText_Util_CheatStart[] = _("CHEAT Start"); +static const u8 sDebugText_Util_HatchAnEgg[] = _("Hatch an Egg"); // Flags/Vars Menu static const u8 sDebugText_FlagsVars_Flags[] = _("Set Flag XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"); static const u8 sDebugText_FlagsVars_Flag[] = _("Flag: {STR_VAR_1}{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}"); @@ -597,6 +601,7 @@ static const struct ListMenuItem sDebugMenu_Items_Utilities[] = [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = {sDebugText_Util_Trainer_Id, DEBUG_UTIL_MENU_ITEM_TRAINER_ID}, [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = {sDebugText_Util_Clear_Boxes, DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES}, [DEBUG_UTIL_MENU_ITEM_CHEAT] = {sDebugText_Util_CheatStart, DEBUG_UTIL_MENU_ITEM_CHEAT}, + [DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG] = {sDebugText_Util_HatchAnEgg, DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG}, }; static const struct ListMenuItem sDebugMenu_Items_Scripts[] = { @@ -729,6 +734,7 @@ static void (*const sDebugMenu_Actions_Utilities[])(u8) = [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = DebugAction_Util_Trainer_Id, [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = DebugAction_Util_Clear_Boxes, [DEBUG_UTIL_MENU_ITEM_CHEAT] = DebugAction_Util_CheatStart, + [DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG] = DebugAction_Util_HatchAnEgg, }; static void (*const sDebugMenu_Actions_Scripts[])(u8) = { @@ -1976,6 +1982,10 @@ static void DebugAction_Util_CheatStart(u8 taskId) { Debug_DestroyMenu_Full_Script(taskId, Debug_CheatStart); } +static void DebugAction_Util_HatchAnEgg(u8 taskId) +{ + Debug_DestroyMenu_Full_Script(taskId, Debug_HatchAnEgg); +} // ******************************* // Actions Scripts From 6d7d7f109ec9ea8637d8750d514b34fdf4136c73 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 19 Jul 2023 23:38:09 +0200 Subject: [PATCH 063/111] Fix debug menu memory overflow (#3154) --- src/debug.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index ffacba9da..58f136492 100644 --- a/src/debug.c +++ b/src/debug.c @@ -211,6 +211,8 @@ enum { //Sound #define DEBUG_NUMBER_ICON_X 210 #define DEBUG_NUMBER_ICON_Y 50 +#define DEBUG_MAX_MENU_ITEMS 50 + // ******************************* struct DebugMonData { @@ -234,7 +236,7 @@ struct DebugMonData struct DebugMenuListData { struct ListMenuItem listItems[20 + 1]; - u8 itemNames[PC_ITEMS_COUNT + 1][26]; + u8 itemNames[DEBUG_MAX_MENU_ITEMS + 1][26]; u8 listId; }; @@ -1132,6 +1134,8 @@ static void Debug_RefreshListMenu(u8 taskId) totalItems = 7; } + // Failsafe to prevent memory corruption + totalItems = min(totalItems, DEBUG_MAX_MENU_ITEMS); // Copy item names for all entries but the last (which is Cancel) for(i = 0; i < totalItems; i++) { From 89f368db128b52de57a08386a7de4eb71aedab12 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 19 Jul 2023 23:05:07 -0400 Subject: [PATCH 064/111] Fixed missing versions --- .github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 ++- .github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 ++- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 7a04bf329..55d4fada4 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -23,8 +23,9 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.5.0 (Default) + - 1.5.1 (Default) - upcoming (Edge) + - 1.5.0 - 1.4.3 - 1.4.2 - 1.4.1 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index ef03b5547..8c28b3942 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,8 +23,9 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.5.0 (Default) + - 1.5.1 (Default) - upcoming (Edge) + - 1.5.0 - 1.4.3 - 1.4.2 - 1.4.1 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index a1ff7e0c4..6f11d5b9a 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,8 +23,9 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.5.0 (Default) + - 1.5.1 (Default) - upcoming (Edge) + - 1.5.0 - 1.4.3 - 1.4.2 - 1.4.1 From b406a9c1bdd4c33cfdf01d0532d1f280bfe74bb6 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Wed, 19 Jul 2023 16:44:21 +0100 Subject: [PATCH 065/111] RandomUniformExcept and RNG_METRONOME --- include/random.h | 7 ++++++ src/battle_script_commands.c | 40 ++++++++++++++++------------------ src/random.c | 13 +++++++++++ test/move_effect_metronome.c | 20 ++++++----------- test/random.c | 42 ++++++++++++++++++++++++++++++++++++ test/test_battle.h | 5 +++-- test/test_runner_battle.c | 38 +++++++++++++++++++++++++++++++- 7 files changed, 126 insertions(+), 39 deletions(-) diff --git a/include/random.h b/include/random.h index e7c2a3e28..777088005 100644 --- a/include/random.h +++ b/include/random.h @@ -32,6 +32,10 @@ void SeedRng2(u16 seed); * RandomUniform(tag, lo, hi) returns a number from lo to hi inclusive * with uniform probability. * + * RandomUniformExcept(tag, lo, hi, reject) returns a number from lo to + * hi inclusive with uniform probability, excluding those for which + * reject returns TRUE. + * * RandomElement(tag, array) returns an element in array with uniform * probability. The array must be known at compile-time (e.g. a global * const array). @@ -58,6 +62,7 @@ enum RandomTag RNG_FROZEN, RNG_HOLD_EFFECT_FLINCH, RNG_INFATUATION, + RNG_METRONOME, RNG_PARALYSIS, RNG_POISON_POINT, RNG_RAMPAGE_TURNS, @@ -103,10 +108,12 @@ enum RandomTag }) u32 RandomUniform(enum RandomTag, u32 lo, u32 hi); +u32 RandomUniformExcept(enum RandomTag, u32 lo, u32 hi, bool32 (*reject)(u32)); u32 RandomWeightedArray(enum RandomTag, u32 sum, u32 n, const u8 *weights); const void *RandomElementArray(enum RandomTag, const void *array, size_t size, size_t count); u32 RandomUniformDefault(enum RandomTag, u32 lo, u32 hi); +u32 RandomUniformExceptDefault(enum RandomTag, u32 lo, u32 hi, bool32 (*reject)(u32)); u32 RandomWeightedArrayDefault(enum RandomTag, u32 sum, u32 n, const u8 *weights); const void *RandomElementArrayDefault(enum RandomTag, const void *array, size_t size, size_t count); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 74e13b6d8..9a9a3c3ae 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12977,41 +12977,37 @@ static void Cmd_mimicattackcopy(void) } } +static bool32 InvalidMetronomeMove(u32 move) +{ + return gBattleMoves[move].effect == EFFECT_PLACEHOLDER + || sForbiddenMoves[move] & FORBIDDEN_METRONOME; +} + static void Cmd_metronome(void) { CMD_ARGS(); #if B_METRONOME_MOVES >= GEN_9 - u16 moveCount = MOVES_COUNT_GEN9; + u32 moveCount = MOVES_COUNT_GEN9; #elif B_METRONOME_MOVES >= GEN_8 - u16 moveCount = MOVES_COUNT_GEN8; + u32 moveCount = MOVES_COUNT_GEN8; #elif B_METRONOME_MOVES >= GEN_7 - u16 moveCount = MOVES_COUNT_GEN7; + u32 moveCount = MOVES_COUNT_GEN7; #elif B_METRONOME_MOVES >= GEN_6 - u16 moveCount = MOVES_COUNT_GEN6; + u32 moveCount = MOVES_COUNT_GEN6; #elif B_METRONOME_MOVES >= GEN_5 - u16 moveCount = MOVES_COUNT_GEN5; + u32 moveCount = MOVES_COUNT_GEN5; #elif B_METRONOME_MOVES >= GEN_4 - u16 moveCount = MOVES_COUNT_GEN4; + u32 moveCount = MOVES_COUNT_GEN4; #elif B_METRONOME_MOVES >= GEN_3 - u16 moveCount = MOVES_COUNT_GEN3; + u32 moveCount = MOVES_COUNT_GEN3; #endif - while (TRUE) - { - gCurrentMove = (Random() % (moveCount - 1)) + 1; - if (gBattleMoves[gCurrentMove].effect == EFFECT_PLACEHOLDER) - continue; - - if (!(sForbiddenMoves[gCurrentMove] & FORBIDDEN_METRONOME)) - { - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - SetAtkCancellerForCalledMove(); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - return; - } - } + gCurrentMove = RandomUniformExcept(RNG_METRONOME, 1, moveCount - 1, InvalidMetronomeMove); + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + SetAtkCancellerForCalledMove(); + gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; + gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } static void Cmd_dmgtolevel(void) diff --git a/src/random.c b/src/random.c index 14983e776..0c2509bd9 100644 --- a/src/random.c +++ b/src/random.c @@ -35,6 +35,9 @@ u16 Random2(void) __attribute__((weak, alias("RandomUniformDefault"))) u32 RandomUniform(enum RandomTag tag, u32 lo, u32 hi); +__attribute__((weak, alias("RandomUniformExceptDefault"))) +u32 RandomUniformExcept(enum RandomTag, u32 lo, u32 hi, bool32 (*reject)(u32)); + __attribute__((weak, alias("RandomWeightedArrayDefault"))) u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights); @@ -46,6 +49,16 @@ u32 RandomUniformDefault(enum RandomTag tag, u32 lo, u32 hi) return lo + (((hi - lo + 1) * Random()) >> 16); } +u32 RandomUniformExceptDefault(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32)) +{ + while (TRUE) + { + u32 n = RandomUniformDefault(tag, lo, hi); + if (!reject(n)) + return n; + } +} + u32 RandomWeightedArrayDefault(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) { s32 i, targetSum; diff --git a/test/move_effect_metronome.c b/test/move_effect_metronome.c index 11a906f94..7265d5aa8 100644 --- a/test/move_effect_metronome.c +++ b/test/move_effect_metronome.c @@ -6,19 +6,13 @@ ASSUMPTIONS ASSUME(gBattleMoves[MOVE_METRONOME].effect == EFFECT_METRONOME); } -// To do: Turn the seeds to work with WITH_RNG for Metronome. -#define RNG_METRONOME_SCRATCH 0x118 -#define RNG_METRONOME_PSN_POWDER 0x119 -#define RNG_METRONOME_ROCK_BLAST 0x1F5 - SINGLE_BATTLE_TEST("Metronome picks a random move") { GIVEN { - RNGSeed(RNG_METRONOME_SCRATCH); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_METRONOME); } + TURN { MOVE(player, MOVE_METRONOME, WITH_RNG(RNG_METRONOME, MOVE_SCRATCH)); } } SCENE { MESSAGE("Wobbuffet used Metronome!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, player); @@ -34,11 +28,10 @@ SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") ASSUME(gBattleMoves[MOVE_POISON_POWDER].flags & FLAG_POWDER); ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); ASSUME(gBattleMoves[MOVE_POISON_POWDER].effect == EFFECT_POISON); - RNGSeed(RNG_METRONOME_PSN_POWDER); - PLAYER(SPECIES_WOBBUFFET) {Speed(5);} - OPPONENT(SPECIES_TANGELA) {Speed(2);} + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TANGELA); } WHEN { - TURN { MOVE(player, MOVE_METRONOME); } + TURN { MOVE(player, MOVE_METRONOME, WITH_RNG(RNG_METRONOME, MOVE_POISON_POWDER)); } } SCENE { MESSAGE("Wobbuffet used Metronome!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, player); @@ -53,17 +46,16 @@ SINGLE_BATTLE_TEST("Metronome's called multi-hit move hits multiple times") { GIVEN { ASSUME(gBattleMoves[MOVE_ROCK_BLAST].effect == EFFECT_MULTI_HIT); - RNGSeed(RNG_METRONOME_ROCK_BLAST); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_METRONOME); } + TURN { MOVE(player, MOVE_METRONOME, WITH_RNG(RNG_METRONOME, MOVE_ROCK_BLAST)); } } SCENE { MESSAGE("Wobbuffet used Metronome!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, player); MESSAGE("Wobbuffet used Rock Blast!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_BLAST, player); HP_BAR(opponent); - MESSAGE("Hit 4 time(s)!"); + MESSAGE("Hit 2 time(s)!"); } } diff --git a/test/random.c b/test/random.c index 39f587c06..a56e91a10 100644 --- a/test/random.c +++ b/test/random.c @@ -16,6 +16,25 @@ TEST("RandomUniform generates lo..hi") } } +static bool32 InvalidEven(u32 n) +{ + return n % 2 == 0; +} + +TEST("RandomUniformExcept generates lo..hi") +{ + u32 lo, hi, i; + PARAMETRIZE { lo = 0; hi = 1; } + PARAMETRIZE { lo = 0; hi = 2; } + PARAMETRIZE { lo = 0; hi = 3; } + PARAMETRIZE { lo = 2; hi = 4; } + for (i = 0; i < 1024; i++) + { + u32 r = RandomUniformExceptDefault(RNG_NONE, lo, hi, InvalidEven); + EXPECT(lo <= r && r <= hi && r % 2 != 0); + } +} + TEST("RandomWeighted generates 0..n-1") { u32 n, sum, i; @@ -65,6 +84,29 @@ TEST("RandomUniform generates uniform distribution") EXPECT_LT(error, UQ_4_12(0.025)); } +TEST("RandomUniformExcept generates uniform distribution") +{ + u32 i, error; + u16 distribution[4]; + + memset(distribution, 0, sizeof(distribution)); + for (i = 0; i < 4096; i++) + { + u32 r = RandomUniformExceptDefault(RNG_NONE, 0, ARRAY_COUNT(distribution) - 1, InvalidEven); + EXPECT(0 <= r && r < ARRAY_COUNT(distribution)); + distribution[r]++; + } + + error = 0; + for (i = 0; i < ARRAY_COUNT(distribution); i++) + { + if (i % 2 != 0) + error += abs(UQ_4_12(0.5) - distribution[i]); + } + + EXPECT_LT(error, UQ_4_12(0.05)); +} + TEST("RandomWeighted generates distribution in proportion to the weights") { u32 i, sum, error; diff --git a/test/test_battle.h b/test/test_battle.h index 039506c1b..b4f38ed91 100644 --- a/test/test_battle.h +++ b/test/test_battle.h @@ -603,8 +603,9 @@ struct BattleTestRunnerState u8 parameters; u8 runParameter; u16 rngTag; - u8 trials; - u8 runTrial; + u16 rngTrialOffset; + u16 trials; + u16 runTrial; u16 expectedRatio; u16 observedRatio; u16 trialRatio; diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 592d0db98..a2375aef8 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -332,7 +332,42 @@ u32 RandomUniform(enum RandomTag tag, u32 lo, u32 hi) { Test_ExitWithResult(TEST_RESULT_ERROR, "RandomUniform called with inconsistent trials %d and %d", STATE->trials, n); } - STATE->trialRatio = Q_4_12(1) / n; + STATE->trialRatio = Q_4_12(1) / STATE->trials; + return STATE->runTrial + lo; + } + + return hi; +} + +u32 RandomUniformExcept(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32)) +{ + const struct BattlerTurn *turn = NULL; + u32 default_; + + if (gCurrentTurnActionNumber < gBattlersCount) + { + u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; + turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; + if (turn && turn->rng.tag == tag) + { + if (reject(turn->rng.value)) + Test_ExitWithResult(TEST_RESULT_INVALID, "WITH_RNG specified a rejected value (%d)", turn->rng.value); + return turn->rng.value; + } + } + + if (tag == STATE->rngTag) + { + if (STATE->trials == 1) + { + u32 n = 0, i; + for (i = lo; i < hi; i++) + if (!reject(i)) + n++; + STATE->trials = n; + PrintTestName(); + } + STATE->trialRatio = Q_4_12(1) / STATE->trials; return STATE->runTrial + lo; } @@ -962,6 +997,7 @@ void Randomly(u32 sourceLine, u32 passes, u32 trials, struct RandomlyContext ctx INVALID_IF(test->resultsSize > 0, "PASSES_RANDOMLY is incompatible with results"); INVALID_IF(passes > trials, "%d passes specified, but only %d trials", passes, trials); STATE->rngTag = ctx.tag; + STATE->rngTrialOffset = 0; STATE->runTrial = 0; STATE->expectedRatio = Q_4_12(passes) / trials; STATE->observedRatio = 0; From fc37345c29c558a75dad4cb2638caf553e844259 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 21 Jul 2023 10:42:39 +0200 Subject: [PATCH 066/111] Fix wrong color in stat move animation --- include/battle_anim.h | 9 +++--- include/constants/battle.h | 60 +++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/include/battle_anim.h b/include/battle_anim.h index a3677bd98..28096d603 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -2,6 +2,7 @@ #define GUARD_BATTLE_ANIM_H #include "battle.h" +#include "constants/battle.h" #include "constants/battle_anim.h" #include "task.h" @@ -204,10 +205,10 @@ u8 GetBattlerSpriteDefault_Y(u8 battlerId); u8 GetSubstituteSpriteDefault_Y(u8 battlerId); // battle_anim_status_effects.c -#define STAT_ANIM_PLUS1 15 -#define STAT_ANIM_PLUS2 39 -#define STAT_ANIM_MINUS1 22 -#define STAT_ANIM_MINUS2 46 +#define STAT_ANIM_PLUS1 MOVE_EFFECT_ATK_PLUS_1 +#define STAT_ANIM_PLUS2 MOVE_EFFECT_ATK_PLUS_2 +#define STAT_ANIM_MINUS1 MOVE_EFFECT_ATK_MINUS_1 +#define STAT_ANIM_MINUS2 MOVE_EFFECT_ATK_MINUS_2 #define STAT_ANIM_MULTIPLE_PLUS1 55 #define STAT_ANIM_MULTIPLE_PLUS2 56 #define STAT_ANIM_MULTIPLE_MINUS1 57 diff --git a/include/constants/battle.h b/include/constants/battle.h index 814d1bfa5..80810498c 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -321,21 +321,21 @@ #define MOVE_EFFECT_PAYDAY 12 #define MOVE_EFFECT_CHARGING 13 #define MOVE_EFFECT_WRAP 14 -#define MOVE_EFFECT_BURN_UP 15 // MOVE_EFFECT_BURN_UP replaces unused MOVE_EFFECT_RECOIL_25 so that stat change animations don't break -#define MOVE_EFFECT_ATK_PLUS_1 16 -#define MOVE_EFFECT_DEF_PLUS_1 17 -#define MOVE_EFFECT_SPD_PLUS_1 18 -#define MOVE_EFFECT_SP_ATK_PLUS_1 19 -#define MOVE_EFFECT_SP_DEF_PLUS_1 20 -#define MOVE_EFFECT_ACC_PLUS_1 21 -#define MOVE_EFFECT_EVS_PLUS_1 22 -#define MOVE_EFFECT_ATK_MINUS_1 23 -#define MOVE_EFFECT_DEF_MINUS_1 24 -#define MOVE_EFFECT_SPD_MINUS_1 25 -#define MOVE_EFFECT_SP_ATK_MINUS_1 26 -#define MOVE_EFFECT_SP_DEF_MINUS_1 27 -#define MOVE_EFFECT_ACC_MINUS_1 28 -#define MOVE_EFFECT_EVS_MINUS_1 29 +#define MOVE_EFFECT_ATK_PLUS_1 15 +#define MOVE_EFFECT_DEF_PLUS_1 16 +#define MOVE_EFFECT_SPD_PLUS_1 17 +#define MOVE_EFFECT_SP_ATK_PLUS_1 18 +#define MOVE_EFFECT_SP_DEF_PLUS_1 19 +#define MOVE_EFFECT_ACC_PLUS_1 20 +#define MOVE_EFFECT_EVS_PLUS_1 21 +#define MOVE_EFFECT_ATK_MINUS_1 22 +#define MOVE_EFFECT_DEF_MINUS_1 23 +#define MOVE_EFFECT_SPD_MINUS_1 24 +#define MOVE_EFFECT_SP_ATK_MINUS_1 25 +#define MOVE_EFFECT_SP_DEF_MINUS_1 26 +#define MOVE_EFFECT_ACC_MINUS_1 27 +#define MOVE_EFFECT_EVS_MINUS_1 28 +#define MOVE_EFFECT_BURN_UP 29 #define MOVE_EFFECT_RECHARGE 30 #define MOVE_EFFECT_RAGE 31 #define MOVE_EFFECT_STEAL_ITEM 32 @@ -345,21 +345,21 @@ #define MOVE_EFFECT_RAPIDSPIN 36 #define MOVE_EFFECT_REMOVE_STATUS 37 #define MOVE_EFFECT_ATK_DEF_DOWN 38 -#define MOVE_EFFECT_SCALE_SHOT 39 // MOVE_EFFECT_SCALE_SHOT replaces unused MOVE_EFFECT_RECOIL_33 so that stat change animations don't break -#define MOVE_EFFECT_ATK_PLUS_2 40 -#define MOVE_EFFECT_DEF_PLUS_2 41 -#define MOVE_EFFECT_SPD_PLUS_2 42 -#define MOVE_EFFECT_SP_ATK_PLUS_2 43 -#define MOVE_EFFECT_SP_DEF_PLUS_2 44 -#define MOVE_EFFECT_ACC_PLUS_2 45 -#define MOVE_EFFECT_EVS_PLUS_2 46 -#define MOVE_EFFECT_ATK_MINUS_2 47 -#define MOVE_EFFECT_DEF_MINUS_2 48 -#define MOVE_EFFECT_SPD_MINUS_2 49 -#define MOVE_EFFECT_SP_ATK_MINUS_2 50 -#define MOVE_EFFECT_SP_DEF_MINUS_2 51 -#define MOVE_EFFECT_ACC_MINUS_2 52 -#define MOVE_EFFECT_EVS_MINUS_2 53 +#define MOVE_EFFECT_ATK_PLUS_2 39 +#define MOVE_EFFECT_DEF_PLUS_2 40 +#define MOVE_EFFECT_SPD_PLUS_2 41 +#define MOVE_EFFECT_SP_ATK_PLUS_2 42 +#define MOVE_EFFECT_SP_DEF_PLUS_2 43 +#define MOVE_EFFECT_ACC_PLUS_2 44 +#define MOVE_EFFECT_EVS_PLUS_2 45 +#define MOVE_EFFECT_ATK_MINUS_2 46 +#define MOVE_EFFECT_DEF_MINUS_2 47 +#define MOVE_EFFECT_SPD_MINUS_2 48 +#define MOVE_EFFECT_SP_ATK_MINUS_2 49 +#define MOVE_EFFECT_SP_DEF_MINUS_2 50 +#define MOVE_EFFECT_ACC_MINUS_2 51 +#define MOVE_EFFECT_EVS_MINUS_2 52 +#define MOVE_EFFECT_SCALE_SHOT 53 #define MOVE_EFFECT_THRASH 54 #define MOVE_EFFECT_KNOCK_OFF 55 #define MOVE_EFFECT_DEF_SPDEF_DOWN 56 From e0271a92e9983284c81c94e666ec8d922618fb58 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 21 Jul 2023 11:40:15 +0200 Subject: [PATCH 067/111] Fix trainer messages appearing for frontier trainers --- src/battle_message.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index d2ca9dfd7..1585f8c47 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -3935,6 +3935,7 @@ u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp) struct TrainerSlide { u16 trainerId; + bool8 isFrontierTrainer; const u8 *msgLastSwitchIn; const u8 *msgLastLowHp; const u8 *msgFirstDown; @@ -3954,6 +3955,7 @@ static const struct TrainerSlide sTrainerSlides[] = Example: { .trainerId = TRAINER_WALLY_VR_2, + .isFrontierTrainer = FALSE, .msgLastSwitchIn = sText_AarghAlmostHadIt, .msgLastLowHp = sText_BoxIsFull, .msgFirstDown = sText_123Poof, @@ -4046,7 +4048,9 @@ u32 ShouldDoTrainerSlide(u32 battlerId, u32 which) for (i = 0; i < ARRAY_COUNT(sTrainerSlides); i++) { - if (trainerId == sTrainerSlides[i].trainerId) + if (trainerId == sTrainerSlides[i].trainerId + && (((gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && sTrainerSlides[i].isFrontierTrainer) + || (!(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && !sTrainerSlides[i].isFrontierTrainer))) { gBattleScripting.battler = battlerId; switch (which) From cd5f997ee30b001c58be5b8e098769d60b88f313 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 21 Jul 2023 07:06:05 -0300 Subject: [PATCH 068/111] Added a debug feature to hatch eggs (#3155) --- data/scripts/debug.inc | 31 +++++++++++++++++++++++++++++++ src/debug.c | 10 ++++++++++ 2 files changed, 41 insertions(+) diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index d7f486907..64b7e1dd0 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -112,4 +112,35 @@ Debug_SaveBlock2Size:: Debug_PokemonStorageSize:: .string "{PKMN}Storage size: {STR_VAR_1}/{STR_VAR_2}.$" +Debug_HatchAnEgg:: + lockall + getpartysize + goto_if_eq VAR_RESULT, 0, Debug_HatchAnEgg_NoPokemon + special ChoosePartyMon + waitstate + goto_if_ge VAR_0x8004, PARTY_SIZE, Debug_HatchAnEgg_End + specialvar VAR_RESULT, ScriptGetPartyMonSpecies + goto_if_ne VAR_RESULT, SPECIES_EGG, DebugScript_HatchAnEgg_CantForceHatch + special EggHatch + waitstate +Debug_HatchAnEgg_End:: + releaseall + end + +Debug_HatchAnEgg_NoPokemon:: + msgbox DebugScript_HatchAnEgg_Text_EmptyParty, MSGBOX_DEFAULT + releaseall + end + +DebugScript_HatchAnEgg_CantForceHatch:: + msgbox DebugScript_HatchAnEgg_Text_NotAnEgg, MSGBOX_DEFAULT + releaseall + end + +DebugScript_HatchAnEgg_Text_EmptyParty:: + .string "You have no PokΓ©mon nor Eggs.$" + +DebugScript_HatchAnEgg_Text_NotAnEgg:: + .string "That's not a PokΓ©mon Egg.$" + .endif diff --git a/src/debug.c b/src/debug.c index 58f136492..a46122bab 100644 --- a/src/debug.c +++ b/src/debug.c @@ -91,6 +91,7 @@ enum { // Util DEBUG_UTIL_MENU_ITEM_TRAINER_ID, DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES, DEBUG_UTIL_MENU_ITEM_CHEAT, + DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG, }; enum { // Scripts DEBUG_UTIL_MENU_ITEM_SCRIPT_1, @@ -314,6 +315,7 @@ static void DebugAction_Util_Trainer_Gender(u8 taskId); static void DebugAction_Util_Trainer_Id(u8 taskId); static void DebugAction_Util_Clear_Boxes(u8 taskId); static void DebugAction_Util_CheatStart(u8 taskId); +static void DebugAction_Util_HatchAnEgg(u8 taskId); static void DebugAction_FlagsVars_Flags(u8 taskId); static void DebugAction_FlagsVars_FlagsSelect(u8 taskId); @@ -383,6 +385,7 @@ extern u8 Debug_Script_8[]; extern u8 Debug_ShowFieldMessageStringVar4[]; extern u8 Debug_CheatStart[]; +extern u8 Debug_HatchAnEgg[]; extern u8 PlayersHouse_2F_EventScript_SetWallClock[]; extern u8 PlayersHouse_2F_EventScript_CheckWallClock[]; extern u8 Debug_CheckSaveBlock[]; @@ -438,6 +441,7 @@ static const u8 sDebugText_Util_Trainer_Gender[] = _("Toggle T. Gender" static const u8 sDebugText_Util_Trainer_Id[] = _("New Trainer Id"); static const u8 sDebugText_Util_Clear_Boxes[] = _("Clear Storage Boxes"); static const u8 sDebugText_Util_CheatStart[] = _("CHEAT Start"); +static const u8 sDebugText_Util_HatchAnEgg[] = _("Hatch an Egg"); // Flags/Vars Menu static const u8 sDebugText_FlagsVars_Flags[] = _("Set Flag XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"); static const u8 sDebugText_FlagsVars_Flag[] = _("Flag: {STR_VAR_1}{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}"); @@ -599,6 +603,7 @@ static const struct ListMenuItem sDebugMenu_Items_Utilities[] = [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = {sDebugText_Util_Trainer_Id, DEBUG_UTIL_MENU_ITEM_TRAINER_ID}, [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = {sDebugText_Util_Clear_Boxes, DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES}, [DEBUG_UTIL_MENU_ITEM_CHEAT] = {sDebugText_Util_CheatStart, DEBUG_UTIL_MENU_ITEM_CHEAT}, + [DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG] = {sDebugText_Util_HatchAnEgg, DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG}, }; static const struct ListMenuItem sDebugMenu_Items_Scripts[] = { @@ -731,6 +736,7 @@ static void (*const sDebugMenu_Actions_Utilities[])(u8) = [DEBUG_UTIL_MENU_ITEM_TRAINER_ID] = DebugAction_Util_Trainer_Id, [DEBUG_UTIL_MENU_ITEM_CLEAR_BOXES] = DebugAction_Util_Clear_Boxes, [DEBUG_UTIL_MENU_ITEM_CHEAT] = DebugAction_Util_CheatStart, + [DEBUG_UTIL_MENU_ITEM_HATCH_AN_EGG] = DebugAction_Util_HatchAnEgg, }; static void (*const sDebugMenu_Actions_Scripts[])(u8) = { @@ -1980,6 +1986,10 @@ static void DebugAction_Util_CheatStart(u8 taskId) { Debug_DestroyMenu_Full_Script(taskId, Debug_CheatStart); } +static void DebugAction_Util_HatchAnEgg(u8 taskId) +{ + Debug_DestroyMenu_Full_Script(taskId, Debug_HatchAnEgg); +} // ******************************* // Actions Scripts From ad25dfe1e9970ef0d6383c7ce0f354ccd0b659ad Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 21 Jul 2023 20:43:39 +0200 Subject: [PATCH 069/111] Set otGender + Moves in FillPartnerParty (#3163) --- include/battle_main.h | 1 + src/battle_main.c | 5 ++--- src/battle_tower.c | 9 +++------ 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/include/battle_main.h b/include/battle_main.h index 4f20e4c17..5f603654b 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -72,6 +72,7 @@ bool32 IsWildMonSmart(void); u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer *trainer, bool32 firstTrainer, u32 battleTypeFlags); void ModifyPersonalityForNature(u32 *personality, u32 newNature); u32 GeneratePersonalityForGender(u32 gender, u32 species); +void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMonCustomized *partyEntry); extern struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE]; diff --git a/src/battle_main.c b/src/battle_main.c index f6d822e3f..5841f8f61 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -120,7 +120,6 @@ static void SpriteCB_UnusedBattleInit_Main(struct Sprite *sprite); static void TrySpecialEvolution(void); static u32 Crc32B (const u8 *data, u32 size); static u32 GeneratePartyHash(const struct Trainer *trainer, u32 i); -static void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMonCustomized *partyEntry); EWRAM_DATA u16 gBattle_BG0_X = 0; EWRAM_DATA u16 gBattle_BG0_Y = 0; @@ -1936,7 +1935,7 @@ u32 GeneratePersonalityForGender(u32 gender, u32 species) return speciesInfo->genderRatio / 2; } -static void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMonCustomized *partyEntry) +void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMonCustomized *partyEntry) { bool32 noMoveSet = TRUE; u32 j; @@ -3861,7 +3860,7 @@ static void TryDoEventsBeforeFirstTurn(void) while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) { gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter++]; - + if (TryPrimalReversion(gBattlerAttacker)) return; if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerAttacker, 0, 0, 0) != 0) diff --git a/src/battle_tower.c b/src/battle_tower.c index 4e16467f0..51d7e16b3 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -3119,13 +3119,8 @@ static void FillPartnerParty(u16 trainerId) CreateMon(&gPlayerParty[i + 3], partyData[i].species, partyData[i].lvl, 0, TRUE, j, otIdType, otID); SetMonData(&gPlayerParty[i + 3], MON_DATA_HELD_ITEM, &partyData[i].heldItem); + CustomTrainerPartyAssignMoves(&gPlayerParty[i+3], &partyData[i]); - // TODO: Figure out a default strategy when moves are not set, to generate a good moveset - for (j = 0; j < MAX_MON_MOVES; ++j) - { - SetMonData(&gPlayerParty[i+3], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); - SetMonData(&gPlayerParty[i+3], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); - } SetMonData(&gPlayerParty[i+3], MON_DATA_IVS, &(partyData[i].iv)); if (partyData[i].ev != NULL) { @@ -3164,6 +3159,8 @@ static void FillPartnerParty(u16 trainerId) StringCopy(trainerName, gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].trainerName); SetMonData(&gPlayerParty[i + 3], MON_DATA_OT_NAME, trainerName); + j = gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].encounterMusic_gender >> 7; + SetMonData(&gPlayerParty[i+3], MON_DATA_OT_GENDER, &j); } } else if (trainerId == TRAINER_EREADER) From fc8ee625b68d061027384e74b95d5f5fd9a1e2f0 Mon Sep 17 00:00:00 2001 From: gruxor Date: Fri, 21 Jul 2023 15:51:03 -0400 Subject: [PATCH 070/111] Fixed outstanding UB with -fanalyzer on modern --- Makefile | 2 +- include/overworld.h | 2 +- src/battle_gfx_sfx_util.c | 7 +- src/fieldmap.c | 29 +- src/overworld.c | 13 +- src/pokemon.c | 1112 +++++++++++++++++++------------------ 6 files changed, 594 insertions(+), 571 deletions(-) diff --git a/Makefile b/Makefile index c4964e42e..f107a09d4 100644 --- a/Makefile +++ b/Makefile @@ -118,7 +118,7 @@ LIBPATH := -L ../../tools/agbcc/lib LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall else CC1 = $(shell $(PATH_MODERNCC) --print-prog-name=cc1) -quiet -override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast +override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -std=gnu17 -fanalyzer ROM := $(MODERN_ROM_NAME) OBJ_DIR := $(MODERN_OBJ_DIR_NAME) LIBPATH := -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libc.a))" diff --git a/include/overworld.h b/include/overworld.h index adaa6aad0..bda2046ec 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -67,7 +67,7 @@ void LoadObjEventTemplatesFromHeader(void); void LoadSaveblockObjEventScripts(void); void SetObjEventTemplateCoords(u8 localId, s16 x, s16 y); void SetObjEventTemplateMovementType(u8 localId, u8 movementType); -const struct MapLayout *GetMapLayout(void); +const struct MapLayout *GetMapLayout(u16 mapLayoutId); void ApplyCurrentWarp(void); struct MapHeader const *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum); struct MapHeader const *const GetDestinationWarpMapHeader(void); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index bf3422c13..24011d670 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -1210,8 +1210,11 @@ void AllocateMonSpritesGfx(void) for (j = 0; j < 4; j++) { - gMonSpritesGfxPtr->frameImages[i][j].data = gMonSpritesGfxPtr->sprites.ptr[i] + (j * MON_PIC_SIZE); - gMonSpritesGfxPtr->frameImages[i][j].size = MON_PIC_SIZE; + if (gMonSpritesGfxPtr->sprites.ptr[i] + (j * MON_PIC_SIZE)) + { + gMonSpritesGfxPtr->frameImages[i][j].data = gMonSpritesGfxPtr->sprites.ptr[i] + (j * MON_PIC_SIZE); + gMonSpritesGfxPtr->frameImages[i][j].size = MON_PIC_SIZE; + } } gMonSpritesGfxPtr->templates[i].images = gMonSpritesGfxPtr->frameImages[i]; diff --git a/src/fieldmap.c b/src/fieldmap.c index bdacf7ab2..225b1ce69 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -621,8 +621,8 @@ bool32 CanCameraMoveInDirection(int direction) static void SetPositionFromConnection(const struct MapConnection *connection, int direction, int x, int y) { - struct MapHeader const *mapHeader; - mapHeader = GetMapHeaderFromConnection(connection); + struct MapHeader const *mapHeader = GetMapHeaderFromConnection(connection); + switch (direction) { case CONNECTION_EAST: @@ -641,6 +641,9 @@ static void SetPositionFromConnection(const struct MapConnection *connection, in gSaveBlock1Ptr->pos.x -= connection->offset; gSaveBlock1Ptr->pos.y = mapHeader->mapLayout->height; break; + default: + DebugPrintfLevel(MGBA_LOG_WARN, "SetPositionFromConnection was passed an invalid direction (%d)!", direction); + break; } } @@ -663,14 +666,20 @@ bool8 CameraMove(int x, int y) old_x = gSaveBlock1Ptr->pos.x; old_y = gSaveBlock1Ptr->pos.y; connection = GetIncomingConnection(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); - SetPositionFromConnection(connection, direction, x, y); - LoadMapFromCameraTransition(connection->mapGroup, connection->mapNum); - gCamera.active = TRUE; - gCamera.x = old_x - gSaveBlock1Ptr->pos.x; - gCamera.y = old_y - gSaveBlock1Ptr->pos.y; - gSaveBlock1Ptr->pos.x += x; - gSaveBlock1Ptr->pos.y += y; - MoveMapViewToBackup(direction); + if (connection) + { + SetPositionFromConnection(connection, direction, x, y); + LoadMapFromCameraTransition(connection->mapGroup, connection->mapNum); + gCamera.active = TRUE; + gCamera.x = old_x - gSaveBlock1Ptr->pos.x; + gCamera.y = old_y - gSaveBlock1Ptr->pos.y; + gSaveBlock1Ptr->pos.x += x; + gSaveBlock1Ptr->pos.y += y; + MoveMapViewToBackup(direction); + } + else + DebugPrintfLevel(MGBA_LOG_WARN, "GetIncomingConnection returned an invalid connection inside CameraMove!"); + } return gCamera.active; } diff --git a/src/overworld.c b/src/overworld.c index bb1b98611..0152a4857 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -556,12 +556,9 @@ static void InitMapView(void) InitTilesetAnimations(); } -const struct MapLayout *GetMapLayout(void) +const struct MapLayout *GetMapLayout(u16 mapLayoutId) { - u16 mapLayoutId = gSaveBlock1Ptr->mapLayoutId; - if (mapLayoutId) - return gMapLayouts[mapLayoutId - 1]; - return NULL; + return gMapLayouts[mapLayoutId - 1]; } void ApplyCurrentWarp(void) @@ -618,13 +615,13 @@ static void LoadCurrentMapData(void) sLastMapSectionId = gMapHeader.regionMapSectionId; gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); gSaveBlock1Ptr->mapLayoutId = gMapHeader.mapLayoutId; - gMapHeader.mapLayout = GetMapLayout(); + gMapHeader.mapLayout = GetMapLayout(gMapHeader.mapLayoutId); } static void LoadSaveblockMapHeader(void) { gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); - gMapHeader.mapLayout = GetMapLayout(); + gMapHeader.mapLayout = GetMapLayout(gMapHeader.mapLayoutId); } static void SetPlayerCoordsFromWarp(void) @@ -1020,7 +1017,7 @@ u8 GetFlashLevel(void) void SetCurrentMapLayout(u16 mapLayoutId) { gSaveBlock1Ptr->mapLayoutId = mapLayoutId; - gMapHeader.mapLayout = GetMapLayout(); + gMapHeader.mapLayout = GetMapLayout(mapLayoutId); } void SetObjectEventLoadFlag(u8 flag) diff --git a/src/pokemon.c b/src/pokemon.c index 4347d7a0e..929e8ee89 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4771,329 +4771,337 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) boxMon->isEgg = TRUE; substruct3->isEgg = TRUE; } - } - switch (field) - { - case MON_DATA_PERSONALITY: - retVal = boxMon->personality; - break; - case MON_DATA_OT_ID: - retVal = boxMon->otId; - break; - case MON_DATA_NICKNAME: - { - if (boxMon->isBadEgg) + switch (field) { - for (retVal = 0; - retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS; - data[retVal] = gText_BadEgg[retVal], retVal++) {} + case MON_DATA_SPECIES: + retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; + break; + case MON_DATA_HELD_ITEM: + retVal = substruct0->heldItem; + break; + case MON_DATA_EXP: + retVal = substruct0->experience; + break; + case MON_DATA_PP_BONUSES: + retVal = substruct0->ppBonuses; + break; + case MON_DATA_FRIENDSHIP: + retVal = substruct0->friendship; + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + retVal = substruct1->moves[field - MON_DATA_MOVE1]; + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + retVal = substruct1->pp[field - MON_DATA_PP1]; + break; + case MON_DATA_HP_EV: + retVal = substruct2->hpEV; + break; + case MON_DATA_ATK_EV: + retVal = substruct2->attackEV; + break; + case MON_DATA_DEF_EV: + retVal = substruct2->defenseEV; + break; + case MON_DATA_SPEED_EV: + retVal = substruct2->speedEV; + break; + case MON_DATA_SPATK_EV: + retVal = substruct2->spAttackEV; + break; + case MON_DATA_SPDEF_EV: + retVal = substruct2->spDefenseEV; + break; + case MON_DATA_COOL: + retVal = substruct2->cool; + break; + case MON_DATA_BEAUTY: + retVal = substruct2->beauty; + break; + case MON_DATA_CUTE: + retVal = substruct2->cute; + break; + case MON_DATA_SMART: + retVal = substruct2->smart; + break; + case MON_DATA_TOUGH: + retVal = substruct2->tough; + break; + case MON_DATA_SHEEN: + retVal = substruct2->sheen; + break; + case MON_DATA_POKERUS: + retVal = substruct3->pokerus; + break; + case MON_DATA_MET_LOCATION: + retVal = substruct3->metLocation; + break; + case MON_DATA_MET_LEVEL: + retVal = substruct3->metLevel; + break; + case MON_DATA_MET_GAME: + retVal = substruct3->metGame; + break; + case MON_DATA_POKEBALL: + retVal = substruct0->pokeball; + break; + case MON_DATA_OT_GENDER: + retVal = substruct3->otGender; + break; + case MON_DATA_HP_IV: + retVal = substruct3->hpIV; + break; + case MON_DATA_ATK_IV: + retVal = substruct3->attackIV; + break; + case MON_DATA_DEF_IV: + retVal = substruct3->defenseIV; + break; + case MON_DATA_SPEED_IV: + retVal = substruct3->speedIV; + break; + case MON_DATA_SPATK_IV: + retVal = substruct3->spAttackIV; + break; + case MON_DATA_SPDEF_IV: + retVal = substruct3->spDefenseIV; + break; + case MON_DATA_IS_EGG: + retVal = substruct3->isEgg; + break; + case MON_DATA_ABILITY_NUM: + retVal = substruct3->abilityNum; + break; + case MON_DATA_COOL_RIBBON: + retVal = substruct3->coolRibbon; + break; + case MON_DATA_BEAUTY_RIBBON: + retVal = substruct3->beautyRibbon; + break; + case MON_DATA_CUTE_RIBBON: + retVal = substruct3->cuteRibbon; + break; + case MON_DATA_SMART_RIBBON: + retVal = substruct3->smartRibbon; + break; + case MON_DATA_TOUGH_RIBBON: + retVal = substruct3->toughRibbon; + break; + case MON_DATA_CHAMPION_RIBBON: + retVal = substruct3->championRibbon; + break; + case MON_DATA_WINNING_RIBBON: + retVal = substruct3->winningRibbon; + break; + case MON_DATA_VICTORY_RIBBON: + retVal = substruct3->victoryRibbon; + break; + case MON_DATA_ARTIST_RIBBON: + retVal = substruct3->artistRibbon; + break; + case MON_DATA_EFFORT_RIBBON: + retVal = substruct3->effortRibbon; + break; + case MON_DATA_MARINE_RIBBON: + retVal = substruct3->marineRibbon; + break; + case MON_DATA_LAND_RIBBON: + retVal = substruct3->landRibbon; + break; + case MON_DATA_SKY_RIBBON: + retVal = substruct3->skyRibbon; + break; + case MON_DATA_COUNTRY_RIBBON: + retVal = substruct3->countryRibbon; + break; + case MON_DATA_NATIONAL_RIBBON: + retVal = substruct3->nationalRibbon; + break; + case MON_DATA_EARTH_RIBBON: + retVal = substruct3->earthRibbon; + break; + case MON_DATA_WORLD_RIBBON: + retVal = substruct3->worldRibbon; + break; + case MON_DATA_UNUSED_RIBBONS: + retVal = substruct3->unusedRibbons; + break; + case MON_DATA_MODERN_FATEFUL_ENCOUNTER: + retVal = substruct3->modernFatefulEncounter; + break; + case MON_DATA_SPECIES_OR_EGG: + retVal = substruct0->species; + if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) + retVal = SPECIES_EGG; + break; + case MON_DATA_IVS: + retVal = substruct3->hpIV + | (substruct3->attackIV << 5) + | (substruct3->defenseIV << 10) + | (substruct3->speedIV << 15) + | (substruct3->spAttackIV << 20) + | (substruct3->spDefenseIV << 25); + break; + case MON_DATA_KNOWN_MOVES: + if (substruct0->species && !substruct3->isEgg) + { + u16 *moves = (u16 *)data; + s32 i = 0; - data[retVal] = EOS; - } - else if (boxMon->isEgg) - { - StringCopy(data, gText_EggNickname); - retVal = StringLength(data); - } - else if (boxMon->language == LANGUAGE_JAPANESE) - { - data[0] = EXT_CTRL_CODE_BEGIN; - data[1] = EXT_CTRL_CODE_JPN; - - for (retVal = 2, i = 0; - i < 5 && boxMon->nickname[i] != EOS; - data[retVal] = boxMon->nickname[i], retVal++, i++) {} - - data[retVal++] = EXT_CTRL_CODE_BEGIN; - data[retVal++] = EXT_CTRL_CODE_ENG; - data[retVal] = EOS; - } - else - { - for (retVal = 0; - retVal < POKEMON_NAME_LENGTH; - data[retVal] = boxMon->nickname[retVal], retVal++){} - - data[retVal] = EOS; - } - break; - } - case MON_DATA_LANGUAGE: - retVal = boxMon->language; - break; - case MON_DATA_SANITY_IS_BAD_EGG: - retVal = boxMon->isBadEgg; - break; - case MON_DATA_SANITY_HAS_SPECIES: - retVal = boxMon->hasSpecies; - break; - case MON_DATA_SANITY_IS_EGG: - retVal = boxMon->isEgg; - break; - case MON_DATA_OT_NAME: - { - retVal = 0; - - while (retVal < PLAYER_NAME_LENGTH) - { - data[retVal] = boxMon->otName[retVal]; - retVal++; - } - - data[retVal] = EOS; - break; - } - case MON_DATA_MARKINGS: - retVal = boxMon->markings; - break; - case MON_DATA_CHECKSUM: - retVal = boxMon->checksum; - break; - case MON_DATA_ENCRYPT_SEPARATOR: - retVal = boxMon->unknown; - break; - case MON_DATA_SPECIES: - retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; - break; - case MON_DATA_HELD_ITEM: - retVal = substruct0->heldItem; - break; - case MON_DATA_EXP: - retVal = substruct0->experience; - break; - case MON_DATA_PP_BONUSES: - retVal = substruct0->ppBonuses; - break; - case MON_DATA_FRIENDSHIP: - retVal = substruct0->friendship; - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - retVal = substruct1->moves[field - MON_DATA_MOVE1]; - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - retVal = substruct1->pp[field - MON_DATA_PP1]; - break; - case MON_DATA_HP_EV: - retVal = substruct2->hpEV; - break; - case MON_DATA_ATK_EV: - retVal = substruct2->attackEV; - break; - case MON_DATA_DEF_EV: - retVal = substruct2->defenseEV; - break; - case MON_DATA_SPEED_EV: - retVal = substruct2->speedEV; - break; - case MON_DATA_SPATK_EV: - retVal = substruct2->spAttackEV; - break; - case MON_DATA_SPDEF_EV: - retVal = substruct2->spDefenseEV; - break; - case MON_DATA_COOL: - retVal = substruct2->cool; - break; - case MON_DATA_BEAUTY: - retVal = substruct2->beauty; - break; - case MON_DATA_CUTE: - retVal = substruct2->cute; - break; - case MON_DATA_SMART: - retVal = substruct2->smart; - break; - case MON_DATA_TOUGH: - retVal = substruct2->tough; - break; - case MON_DATA_SHEEN: - retVal = substruct2->sheen; - break; - case MON_DATA_POKERUS: - retVal = substruct3->pokerus; - break; - case MON_DATA_MET_LOCATION: - retVal = substruct3->metLocation; - break; - case MON_DATA_MET_LEVEL: - retVal = substruct3->metLevel; - break; - case MON_DATA_MET_GAME: - retVal = substruct3->metGame; - break; - case MON_DATA_POKEBALL: - retVal = substruct0->pokeball; - break; - case MON_DATA_OT_GENDER: - retVal = substruct3->otGender; - break; - case MON_DATA_HP_IV: - retVal = substruct3->hpIV; - break; - case MON_DATA_ATK_IV: - retVal = substruct3->attackIV; - break; - case MON_DATA_DEF_IV: - retVal = substruct3->defenseIV; - break; - case MON_DATA_SPEED_IV: - retVal = substruct3->speedIV; - break; - case MON_DATA_SPATK_IV: - retVal = substruct3->spAttackIV; - break; - case MON_DATA_SPDEF_IV: - retVal = substruct3->spDefenseIV; - break; - case MON_DATA_IS_EGG: - retVal = substruct3->isEgg; - break; - case MON_DATA_ABILITY_NUM: - retVal = substruct3->abilityNum; - break; - case MON_DATA_COOL_RIBBON: - retVal = substruct3->coolRibbon; - break; - case MON_DATA_BEAUTY_RIBBON: - retVal = substruct3->beautyRibbon; - break; - case MON_DATA_CUTE_RIBBON: - retVal = substruct3->cuteRibbon; - break; - case MON_DATA_SMART_RIBBON: - retVal = substruct3->smartRibbon; - break; - case MON_DATA_TOUGH_RIBBON: - retVal = substruct3->toughRibbon; - break; - case MON_DATA_CHAMPION_RIBBON: - retVal = substruct3->championRibbon; - break; - case MON_DATA_WINNING_RIBBON: - retVal = substruct3->winningRibbon; - break; - case MON_DATA_VICTORY_RIBBON: - retVal = substruct3->victoryRibbon; - break; - case MON_DATA_ARTIST_RIBBON: - retVal = substruct3->artistRibbon; - break; - case MON_DATA_EFFORT_RIBBON: - retVal = substruct3->effortRibbon; - break; - case MON_DATA_MARINE_RIBBON: - retVal = substruct3->marineRibbon; - break; - case MON_DATA_LAND_RIBBON: - retVal = substruct3->landRibbon; - break; - case MON_DATA_SKY_RIBBON: - retVal = substruct3->skyRibbon; - break; - case MON_DATA_COUNTRY_RIBBON: - retVal = substruct3->countryRibbon; - break; - case MON_DATA_NATIONAL_RIBBON: - retVal = substruct3->nationalRibbon; - break; - case MON_DATA_EARTH_RIBBON: - retVal = substruct3->earthRibbon; - break; - case MON_DATA_WORLD_RIBBON: - retVal = substruct3->worldRibbon; - break; - case MON_DATA_UNUSED_RIBBONS: - retVal = substruct3->unusedRibbons; - break; - case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - retVal = substruct3->modernFatefulEncounter; - break; - case MON_DATA_SPECIES_OR_EGG: - retVal = substruct0->species; - if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) - retVal = SPECIES_EGG; - break; - case MON_DATA_IVS: - retVal = substruct3->hpIV - | (substruct3->attackIV << 5) - | (substruct3->defenseIV << 10) - | (substruct3->speedIV << 15) - | (substruct3->spAttackIV << 20) - | (substruct3->spDefenseIV << 25); - break; - case MON_DATA_KNOWN_MOVES: - if (substruct0->species && !substruct3->isEgg) - { - u16 *moves = (u16 *)data; - s32 i = 0; - - while (moves[i] != MOVES_COUNT) - { - u16 move = moves[i]; - if (substruct1->moves[0] == move - || substruct1->moves[1] == move - || substruct1->moves[2] == move - || substruct1->moves[3] == move) - retVal |= gBitTable[i]; - i++; + while (moves[i] != MOVES_COUNT) + { + u16 move = moves[i]; + if (substruct1->moves[0] == move + || substruct1->moves[1] == move + || substruct1->moves[2] == move + || substruct1->moves[3] == move) + retVal |= gBitTable[i]; + i++; + } + } + break; + case MON_DATA_RIBBON_COUNT: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal += substruct3->coolRibbon; + retVal += substruct3->beautyRibbon; + retVal += substruct3->cuteRibbon; + retVal += substruct3->smartRibbon; + retVal += substruct3->toughRibbon; + retVal += substruct3->championRibbon; + retVal += substruct3->winningRibbon; + retVal += substruct3->victoryRibbon; + retVal += substruct3->artistRibbon; + retVal += substruct3->effortRibbon; + retVal += substruct3->marineRibbon; + retVal += substruct3->landRibbon; + retVal += substruct3->skyRibbon; + retVal += substruct3->countryRibbon; + retVal += substruct3->nationalRibbon; + retVal += substruct3->earthRibbon; + retVal += substruct3->worldRibbon; + } + break; + case MON_DATA_RIBBONS: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal = substruct3->championRibbon + | (substruct3->coolRibbon << 1) + | (substruct3->beautyRibbon << 4) + | (substruct3->cuteRibbon << 7) + | (substruct3->smartRibbon << 10) + | (substruct3->toughRibbon << 13) + | (substruct3->winningRibbon << 16) + | (substruct3->victoryRibbon << 17) + | (substruct3->artistRibbon << 18) + | (substruct3->effortRibbon << 19) + | (substruct3->marineRibbon << 20) + | (substruct3->landRibbon << 21) + | (substruct3->skyRibbon << 22) + | (substruct3->countryRibbon << 23) + | (substruct3->nationalRibbon << 24) + | (substruct3->earthRibbon << 25) + | (substruct3->worldRibbon << 26); + } + break; + default: + break; } - } - break; - case MON_DATA_RIBBON_COUNT: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) + } + else + { + switch (field) { - retVal += substruct3->coolRibbon; - retVal += substruct3->beautyRibbon; - retVal += substruct3->cuteRibbon; - retVal += substruct3->smartRibbon; - retVal += substruct3->toughRibbon; - retVal += substruct3->championRibbon; - retVal += substruct3->winningRibbon; - retVal += substruct3->victoryRibbon; - retVal += substruct3->artistRibbon; - retVal += substruct3->effortRibbon; - retVal += substruct3->marineRibbon; - retVal += substruct3->landRibbon; - retVal += substruct3->skyRibbon; - retVal += substruct3->countryRibbon; - retVal += substruct3->nationalRibbon; - retVal += substruct3->earthRibbon; - retVal += substruct3->worldRibbon; - } - break; - case MON_DATA_RIBBONS: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) + case MON_DATA_PERSONALITY: + retVal = boxMon->personality; + break; + case MON_DATA_OT_ID: + retVal = boxMon->otId; + break; + case MON_DATA_NICKNAME: { - retVal = substruct3->championRibbon - | (substruct3->coolRibbon << 1) - | (substruct3->beautyRibbon << 4) - | (substruct3->cuteRibbon << 7) - | (substruct3->smartRibbon << 10) - | (substruct3->toughRibbon << 13) - | (substruct3->winningRibbon << 16) - | (substruct3->victoryRibbon << 17) - | (substruct3->artistRibbon << 18) - | (substruct3->effortRibbon << 19) - | (substruct3->marineRibbon << 20) - | (substruct3->landRibbon << 21) - | (substruct3->skyRibbon << 22) - | (substruct3->countryRibbon << 23) - | (substruct3->nationalRibbon << 24) - | (substruct3->earthRibbon << 25) - | (substruct3->worldRibbon << 26); + if (boxMon->isBadEgg) + { + for (retVal = 0; + retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS; + data[retVal] = gText_BadEgg[retVal], retVal++) {} + + data[retVal] = EOS; + } + else if (boxMon->isEgg) + { + StringCopy(data, gText_EggNickname); + retVal = StringLength(data); + } + else if (boxMon->language == LANGUAGE_JAPANESE) + { + data[0] = EXT_CTRL_CODE_BEGIN; + data[1] = EXT_CTRL_CODE_JPN; + + for (retVal = 2, i = 0; + i < 5 && boxMon->nickname[i] != EOS; + data[retVal] = boxMon->nickname[i], retVal++, i++) {} + + data[retVal++] = EXT_CTRL_CODE_BEGIN; + data[retVal++] = EXT_CTRL_CODE_ENG; + data[retVal] = EOS; + } + else + { + for (retVal = 0; + retVal < POKEMON_NAME_LENGTH; + data[retVal] = boxMon->nickname[retVal], retVal++){} + + data[retVal] = EOS; + } + break; + } + case MON_DATA_LANGUAGE: + retVal = boxMon->language; + break; + case MON_DATA_SANITY_IS_BAD_EGG: + retVal = boxMon->isBadEgg; + break; + case MON_DATA_SANITY_HAS_SPECIES: + retVal = boxMon->hasSpecies; + break; + case MON_DATA_SANITY_IS_EGG: + retVal = boxMon->isEgg; + break; + case MON_DATA_OT_NAME: + { + retVal = 0; + + while (retVal < PLAYER_NAME_LENGTH) + { + data[retVal] = boxMon->otName[retVal]; + retVal++; + } + + data[retVal] = EOS; + break; + } + case MON_DATA_MARKINGS: + retVal = boxMon->markings; + break; + case MON_DATA_CHECKSUM: + retVal = boxMon->checksum; + break; + case MON_DATA_ENCRYPT_SEPARATOR: + retVal = boxMon->unknown; + break; + default: + break; } - break; - default: - break; } if (field > MON_DATA_ENCRYPT_SEPARATOR) @@ -5176,242 +5184,248 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) EncryptBoxMon(boxMon); return; } - } - switch (field) - { - case MON_DATA_PERSONALITY: - SET32(boxMon->personality); - break; - case MON_DATA_OT_ID: - SET32(boxMon->otId); - break; - case MON_DATA_NICKNAME: - { - s32 i; - for (i = 0; i < POKEMON_NAME_LENGTH; i++) - boxMon->nickname[i] = data[i]; - break; + switch (field) + { + case MON_DATA_SPECIES: + { + SET16(substruct0->species); + if (substruct0->species) + boxMon->hasSpecies = TRUE; + else + boxMon->hasSpecies = FALSE; + break; + } + case MON_DATA_HELD_ITEM: + SET16(substruct0->heldItem); + break; + case MON_DATA_EXP: + SET32(substruct0->experience); + break; + case MON_DATA_PP_BONUSES: + SET8(substruct0->ppBonuses); + break; + case MON_DATA_FRIENDSHIP: + SET8(substruct0->friendship); + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + SET16(substruct1->moves[field - MON_DATA_MOVE1]); + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + SET8(substruct1->pp[field - MON_DATA_PP1]); + break; + case MON_DATA_HP_EV: + SET8(substruct2->hpEV); + break; + case MON_DATA_ATK_EV: + SET8(substruct2->attackEV); + break; + case MON_DATA_DEF_EV: + SET8(substruct2->defenseEV); + break; + case MON_DATA_SPEED_EV: + SET8(substruct2->speedEV); + break; + case MON_DATA_SPATK_EV: + SET8(substruct2->spAttackEV); + break; + case MON_DATA_SPDEF_EV: + SET8(substruct2->spDefenseEV); + break; + case MON_DATA_COOL: + SET8(substruct2->cool); + break; + case MON_DATA_BEAUTY: + SET8(substruct2->beauty); + break; + case MON_DATA_CUTE: + SET8(substruct2->cute); + break; + case MON_DATA_SMART: + SET8(substruct2->smart); + break; + case MON_DATA_TOUGH: + SET8(substruct2->tough); + break; + case MON_DATA_SHEEN: + SET8(substruct2->sheen); + break; + case MON_DATA_POKERUS: + SET8(substruct3->pokerus); + break; + case MON_DATA_MET_LOCATION: + SET8(substruct3->metLocation); + break; + case MON_DATA_MET_LEVEL: + { + u8 metLevel = *data; + substruct3->metLevel = metLevel; + break; + } + case MON_DATA_MET_GAME: + SET8(substruct3->metGame); + break; + case MON_DATA_POKEBALL: + { + u8 pokeball = *data; + substruct0->pokeball = pokeball; + break; + } + case MON_DATA_OT_GENDER: + SET8(substruct3->otGender); + break; + case MON_DATA_HP_IV: + SET8(substruct3->hpIV); + break; + case MON_DATA_ATK_IV: + SET8(substruct3->attackIV); + break; + case MON_DATA_DEF_IV: + SET8(substruct3->defenseIV); + break; + case MON_DATA_SPEED_IV: + SET8(substruct3->speedIV); + break; + case MON_DATA_SPATK_IV: + SET8(substruct3->spAttackIV); + break; + case MON_DATA_SPDEF_IV: + SET8(substruct3->spDefenseIV); + break; + case MON_DATA_IS_EGG: + SET8(substruct3->isEgg); + if (substruct3->isEgg) + boxMon->isEgg = TRUE; + else + boxMon->isEgg = FALSE; + break; + case MON_DATA_ABILITY_NUM: + SET8(substruct3->abilityNum); + break; + case MON_DATA_COOL_RIBBON: + SET8(substruct3->coolRibbon); + break; + case MON_DATA_BEAUTY_RIBBON: + SET8(substruct3->beautyRibbon); + break; + case MON_DATA_CUTE_RIBBON: + SET8(substruct3->cuteRibbon); + break; + case MON_DATA_SMART_RIBBON: + SET8(substruct3->smartRibbon); + break; + case MON_DATA_TOUGH_RIBBON: + SET8(substruct3->toughRibbon); + break; + case MON_DATA_CHAMPION_RIBBON: + SET8(substruct3->championRibbon); + break; + case MON_DATA_WINNING_RIBBON: + SET8(substruct3->winningRibbon); + break; + case MON_DATA_VICTORY_RIBBON: + SET8(substruct3->victoryRibbon); + break; + case MON_DATA_ARTIST_RIBBON: + SET8(substruct3->artistRibbon); + break; + case MON_DATA_EFFORT_RIBBON: + SET8(substruct3->effortRibbon); + break; + case MON_DATA_MARINE_RIBBON: + SET8(substruct3->marineRibbon); + break; + case MON_DATA_LAND_RIBBON: + SET8(substruct3->landRibbon); + break; + case MON_DATA_SKY_RIBBON: + SET8(substruct3->skyRibbon); + break; + case MON_DATA_COUNTRY_RIBBON: + SET8(substruct3->countryRibbon); + break; + case MON_DATA_NATIONAL_RIBBON: + SET8(substruct3->nationalRibbon); + break; + case MON_DATA_EARTH_RIBBON: + SET8(substruct3->earthRibbon); + break; + case MON_DATA_WORLD_RIBBON: + SET8(substruct3->worldRibbon); + break; + case MON_DATA_UNUSED_RIBBONS: + SET8(substruct3->unusedRibbons); + break; + case MON_DATA_MODERN_FATEFUL_ENCOUNTER: + SET8(substruct3->modernFatefulEncounter); + break; + case MON_DATA_IVS: + { + u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + substruct3->hpIV = ivs & MAX_IV_MASK; + substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; + substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; + substruct3->speedIV = (ivs >> 15) & MAX_IV_MASK; + substruct3->spAttackIV = (ivs >> 20) & MAX_IV_MASK; + substruct3->spDefenseIV = (ivs >> 25) & MAX_IV_MASK; + break; + } + default: + break; + } } - case MON_DATA_LANGUAGE: - SET8(boxMon->language); - break; - case MON_DATA_SANITY_IS_BAD_EGG: - SET8(boxMon->isBadEgg); - break; - case MON_DATA_SANITY_HAS_SPECIES: - SET8(boxMon->hasSpecies); - break; - case MON_DATA_SANITY_IS_EGG: - SET8(boxMon->isEgg); - break; - case MON_DATA_OT_NAME: + else { - s32 i; - for (i = 0; i < PLAYER_NAME_LENGTH; i++) - boxMon->otName[i] = data[i]; - break; - } - case MON_DATA_MARKINGS: - SET8(boxMon->markings); - break; - case MON_DATA_CHECKSUM: - SET16(boxMon->checksum); - break; - case MON_DATA_ENCRYPT_SEPARATOR: - SET16(boxMon->unknown); - break; - case MON_DATA_SPECIES: - { - SET16(substruct0->species); - if (substruct0->species) - boxMon->hasSpecies = TRUE; - else - boxMon->hasSpecies = FALSE; - break; - } - case MON_DATA_HELD_ITEM: - SET16(substruct0->heldItem); - break; - case MON_DATA_EXP: - SET32(substruct0->experience); - break; - case MON_DATA_PP_BONUSES: - SET8(substruct0->ppBonuses); - break; - case MON_DATA_FRIENDSHIP: - SET8(substruct0->friendship); - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - SET16(substruct1->moves[field - MON_DATA_MOVE1]); - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - SET8(substruct1->pp[field - MON_DATA_PP1]); - break; - case MON_DATA_HP_EV: - SET8(substruct2->hpEV); - break; - case MON_DATA_ATK_EV: - SET8(substruct2->attackEV); - break; - case MON_DATA_DEF_EV: - SET8(substruct2->defenseEV); - break; - case MON_DATA_SPEED_EV: - SET8(substruct2->speedEV); - break; - case MON_DATA_SPATK_EV: - SET8(substruct2->spAttackEV); - break; - case MON_DATA_SPDEF_EV: - SET8(substruct2->spDefenseEV); - break; - case MON_DATA_COOL: - SET8(substruct2->cool); - break; - case MON_DATA_BEAUTY: - SET8(substruct2->beauty); - break; - case MON_DATA_CUTE: - SET8(substruct2->cute); - break; - case MON_DATA_SMART: - SET8(substruct2->smart); - break; - case MON_DATA_TOUGH: - SET8(substruct2->tough); - break; - case MON_DATA_SHEEN: - SET8(substruct2->sheen); - break; - case MON_DATA_POKERUS: - SET8(substruct3->pokerus); - break; - case MON_DATA_MET_LOCATION: - SET8(substruct3->metLocation); - break; - case MON_DATA_MET_LEVEL: - { - u8 metLevel = *data; - substruct3->metLevel = metLevel; - break; - } - case MON_DATA_MET_GAME: - SET8(substruct3->metGame); - break; - case MON_DATA_POKEBALL: - { - u8 pokeball = *data; - substruct0->pokeball = pokeball; - break; - } - case MON_DATA_OT_GENDER: - SET8(substruct3->otGender); - break; - case MON_DATA_HP_IV: - SET8(substruct3->hpIV); - break; - case MON_DATA_ATK_IV: - SET8(substruct3->attackIV); - break; - case MON_DATA_DEF_IV: - SET8(substruct3->defenseIV); - break; - case MON_DATA_SPEED_IV: - SET8(substruct3->speedIV); - break; - case MON_DATA_SPATK_IV: - SET8(substruct3->spAttackIV); - break; - case MON_DATA_SPDEF_IV: - SET8(substruct3->spDefenseIV); - break; - case MON_DATA_IS_EGG: - SET8(substruct3->isEgg); - if (substruct3->isEgg) - boxMon->isEgg = TRUE; - else - boxMon->isEgg = FALSE; - break; - case MON_DATA_ABILITY_NUM: - SET8(substruct3->abilityNum); - break; - case MON_DATA_COOL_RIBBON: - SET8(substruct3->coolRibbon); - break; - case MON_DATA_BEAUTY_RIBBON: - SET8(substruct3->beautyRibbon); - break; - case MON_DATA_CUTE_RIBBON: - SET8(substruct3->cuteRibbon); - break; - case MON_DATA_SMART_RIBBON: - SET8(substruct3->smartRibbon); - break; - case MON_DATA_TOUGH_RIBBON: - SET8(substruct3->toughRibbon); - break; - case MON_DATA_CHAMPION_RIBBON: - SET8(substruct3->championRibbon); - break; - case MON_DATA_WINNING_RIBBON: - SET8(substruct3->winningRibbon); - break; - case MON_DATA_VICTORY_RIBBON: - SET8(substruct3->victoryRibbon); - break; - case MON_DATA_ARTIST_RIBBON: - SET8(substruct3->artistRibbon); - break; - case MON_DATA_EFFORT_RIBBON: - SET8(substruct3->effortRibbon); - break; - case MON_DATA_MARINE_RIBBON: - SET8(substruct3->marineRibbon); - break; - case MON_DATA_LAND_RIBBON: - SET8(substruct3->landRibbon); - break; - case MON_DATA_SKY_RIBBON: - SET8(substruct3->skyRibbon); - break; - case MON_DATA_COUNTRY_RIBBON: - SET8(substruct3->countryRibbon); - break; - case MON_DATA_NATIONAL_RIBBON: - SET8(substruct3->nationalRibbon); - break; - case MON_DATA_EARTH_RIBBON: - SET8(substruct3->earthRibbon); - break; - case MON_DATA_WORLD_RIBBON: - SET8(substruct3->worldRibbon); - break; - case MON_DATA_UNUSED_RIBBONS: - SET8(substruct3->unusedRibbons); - break; - case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - SET8(substruct3->modernFatefulEncounter); - break; - case MON_DATA_IVS: - { - u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); - substruct3->hpIV = ivs & MAX_IV_MASK; - substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; - substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; - substruct3->speedIV = (ivs >> 15) & MAX_IV_MASK; - substruct3->spAttackIV = (ivs >> 20) & MAX_IV_MASK; - substruct3->spDefenseIV = (ivs >> 25) & MAX_IV_MASK; - break; - } - default: - break; + switch (field) + { + case MON_DATA_PERSONALITY: + SET32(boxMon->personality); + break; + case MON_DATA_OT_ID: + SET32(boxMon->otId); + break; + case MON_DATA_NICKNAME: + { + s32 i; + for (i = 0; i < POKEMON_NAME_LENGTH; i++) + boxMon->nickname[i] = data[i]; + break; + } + case MON_DATA_LANGUAGE: + SET8(boxMon->language); + break; + case MON_DATA_SANITY_IS_BAD_EGG: + SET8(boxMon->isBadEgg); + break; + case MON_DATA_SANITY_HAS_SPECIES: + SET8(boxMon->hasSpecies); + break; + case MON_DATA_SANITY_IS_EGG: + SET8(boxMon->isEgg); + break; + case MON_DATA_OT_NAME: + { + s32 i; + for (i = 0; i < PLAYER_NAME_LENGTH; i++) + boxMon->otName[i] = data[i]; + break; + } + case MON_DATA_MARKINGS: + SET8(boxMon->markings); + break; + case MON_DATA_CHECKSUM: + SET16(boxMon->checksum); + break; + case MON_DATA_ENCRYPT_SEPARATOR: + SET16(boxMon->unknown); + break; + } } if (field > MON_DATA_ENCRYPT_SEPARATOR) From 4e75f6d4547c5dc69e8355ad5343877217ccc11b Mon Sep 17 00:00:00 2001 From: gruxor Date: Fri, 21 Jul 2023 16:22:43 -0400 Subject: [PATCH 071/111] Minor fix to null check --- src/battle_gfx_sfx_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 24011d670..b7cf2c238 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -1210,7 +1210,7 @@ void AllocateMonSpritesGfx(void) for (j = 0; j < 4; j++) { - if (gMonSpritesGfxPtr->sprites.ptr[i] + (j * MON_PIC_SIZE)) + if (gMonSpritesGfxPtr->sprites.ptr[i]) { gMonSpritesGfxPtr->frameImages[i][j].data = gMonSpritesGfxPtr->sprites.ptr[i] + (j * MON_PIC_SIZE); gMonSpritesGfxPtr->frameImages[i][j].size = MON_PIC_SIZE; From 215d57e8710bc6808de712ab0f07e7188a978ead Mon Sep 17 00:00:00 2001 From: gruxor <95389790+gruxor@users.noreply.github.com> Date: Sat, 22 Jul 2023 14:47:07 -0400 Subject: [PATCH 072/111] Update src/fieldmap.c Co-authored-by: LOuroboros --- src/fieldmap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/fieldmap.c b/src/fieldmap.c index 225b1ce69..2ca274fcc 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -677,8 +677,10 @@ bool8 CameraMove(int x, int y) gSaveBlock1Ptr->pos.y += y; MoveMapViewToBackup(direction); } - else + else + { DebugPrintfLevel(MGBA_LOG_WARN, "GetIncomingConnection returned an invalid connection inside CameraMove!"); + } } return gCamera.active; From 3d25dadcd0b8c3164f65bc002e08e43a1402d971 Mon Sep 17 00:00:00 2001 From: gruxor Date: Sat, 22 Jul 2023 14:49:37 -0400 Subject: [PATCH 073/111] Fixed whitespace indent on switches --- src/pokemon.c | 940 +++++++++++++++++++++++++------------------------- 1 file changed, 470 insertions(+), 470 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 929e8ee89..7fac2958c 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4774,248 +4774,248 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) switch (field) { - case MON_DATA_SPECIES: - retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; - break; - case MON_DATA_HELD_ITEM: - retVal = substruct0->heldItem; - break; - case MON_DATA_EXP: - retVal = substruct0->experience; - break; - case MON_DATA_PP_BONUSES: - retVal = substruct0->ppBonuses; - break; - case MON_DATA_FRIENDSHIP: - retVal = substruct0->friendship; - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - retVal = substruct1->moves[field - MON_DATA_MOVE1]; - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - retVal = substruct1->pp[field - MON_DATA_PP1]; - break; - case MON_DATA_HP_EV: - retVal = substruct2->hpEV; - break; - case MON_DATA_ATK_EV: - retVal = substruct2->attackEV; - break; - case MON_DATA_DEF_EV: - retVal = substruct2->defenseEV; - break; - case MON_DATA_SPEED_EV: - retVal = substruct2->speedEV; - break; - case MON_DATA_SPATK_EV: - retVal = substruct2->spAttackEV; - break; - case MON_DATA_SPDEF_EV: - retVal = substruct2->spDefenseEV; - break; - case MON_DATA_COOL: - retVal = substruct2->cool; - break; - case MON_DATA_BEAUTY: - retVal = substruct2->beauty; - break; - case MON_DATA_CUTE: - retVal = substruct2->cute; - break; - case MON_DATA_SMART: - retVal = substruct2->smart; - break; - case MON_DATA_TOUGH: - retVal = substruct2->tough; - break; - case MON_DATA_SHEEN: - retVal = substruct2->sheen; - break; - case MON_DATA_POKERUS: - retVal = substruct3->pokerus; - break; - case MON_DATA_MET_LOCATION: - retVal = substruct3->metLocation; - break; - case MON_DATA_MET_LEVEL: - retVal = substruct3->metLevel; - break; - case MON_DATA_MET_GAME: - retVal = substruct3->metGame; - break; - case MON_DATA_POKEBALL: - retVal = substruct0->pokeball; - break; - case MON_DATA_OT_GENDER: - retVal = substruct3->otGender; - break; - case MON_DATA_HP_IV: - retVal = substruct3->hpIV; - break; - case MON_DATA_ATK_IV: - retVal = substruct3->attackIV; - break; - case MON_DATA_DEF_IV: - retVal = substruct3->defenseIV; - break; - case MON_DATA_SPEED_IV: - retVal = substruct3->speedIV; - break; - case MON_DATA_SPATK_IV: - retVal = substruct3->spAttackIV; - break; - case MON_DATA_SPDEF_IV: - retVal = substruct3->spDefenseIV; - break; - case MON_DATA_IS_EGG: - retVal = substruct3->isEgg; - break; - case MON_DATA_ABILITY_NUM: - retVal = substruct3->abilityNum; - break; - case MON_DATA_COOL_RIBBON: - retVal = substruct3->coolRibbon; - break; - case MON_DATA_BEAUTY_RIBBON: - retVal = substruct3->beautyRibbon; - break; - case MON_DATA_CUTE_RIBBON: - retVal = substruct3->cuteRibbon; - break; - case MON_DATA_SMART_RIBBON: - retVal = substruct3->smartRibbon; - break; - case MON_DATA_TOUGH_RIBBON: - retVal = substruct3->toughRibbon; - break; - case MON_DATA_CHAMPION_RIBBON: - retVal = substruct3->championRibbon; - break; - case MON_DATA_WINNING_RIBBON: - retVal = substruct3->winningRibbon; - break; - case MON_DATA_VICTORY_RIBBON: - retVal = substruct3->victoryRibbon; - break; - case MON_DATA_ARTIST_RIBBON: - retVal = substruct3->artistRibbon; - break; - case MON_DATA_EFFORT_RIBBON: - retVal = substruct3->effortRibbon; - break; - case MON_DATA_MARINE_RIBBON: - retVal = substruct3->marineRibbon; - break; - case MON_DATA_LAND_RIBBON: - retVal = substruct3->landRibbon; - break; - case MON_DATA_SKY_RIBBON: - retVal = substruct3->skyRibbon; - break; - case MON_DATA_COUNTRY_RIBBON: - retVal = substruct3->countryRibbon; - break; - case MON_DATA_NATIONAL_RIBBON: - retVal = substruct3->nationalRibbon; - break; - case MON_DATA_EARTH_RIBBON: - retVal = substruct3->earthRibbon; - break; - case MON_DATA_WORLD_RIBBON: - retVal = substruct3->worldRibbon; - break; - case MON_DATA_UNUSED_RIBBONS: - retVal = substruct3->unusedRibbons; - break; - case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - retVal = substruct3->modernFatefulEncounter; - break; - case MON_DATA_SPECIES_OR_EGG: - retVal = substruct0->species; - if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) - retVal = SPECIES_EGG; - break; - case MON_DATA_IVS: - retVal = substruct3->hpIV - | (substruct3->attackIV << 5) - | (substruct3->defenseIV << 10) - | (substruct3->speedIV << 15) - | (substruct3->spAttackIV << 20) - | (substruct3->spDefenseIV << 25); - break; - case MON_DATA_KNOWN_MOVES: - if (substruct0->species && !substruct3->isEgg) - { - u16 *moves = (u16 *)data; - s32 i = 0; + case MON_DATA_SPECIES: + retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; + break; + case MON_DATA_HELD_ITEM: + retVal = substruct0->heldItem; + break; + case MON_DATA_EXP: + retVal = substruct0->experience; + break; + case MON_DATA_PP_BONUSES: + retVal = substruct0->ppBonuses; + break; + case MON_DATA_FRIENDSHIP: + retVal = substruct0->friendship; + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + retVal = substruct1->moves[field - MON_DATA_MOVE1]; + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + retVal = substruct1->pp[field - MON_DATA_PP1]; + break; + case MON_DATA_HP_EV: + retVal = substruct2->hpEV; + break; + case MON_DATA_ATK_EV: + retVal = substruct2->attackEV; + break; + case MON_DATA_DEF_EV: + retVal = substruct2->defenseEV; + break; + case MON_DATA_SPEED_EV: + retVal = substruct2->speedEV; + break; + case MON_DATA_SPATK_EV: + retVal = substruct2->spAttackEV; + break; + case MON_DATA_SPDEF_EV: + retVal = substruct2->spDefenseEV; + break; + case MON_DATA_COOL: + retVal = substruct2->cool; + break; + case MON_DATA_BEAUTY: + retVal = substruct2->beauty; + break; + case MON_DATA_CUTE: + retVal = substruct2->cute; + break; + case MON_DATA_SMART: + retVal = substruct2->smart; + break; + case MON_DATA_TOUGH: + retVal = substruct2->tough; + break; + case MON_DATA_SHEEN: + retVal = substruct2->sheen; + break; + case MON_DATA_POKERUS: + retVal = substruct3->pokerus; + break; + case MON_DATA_MET_LOCATION: + retVal = substruct3->metLocation; + break; + case MON_DATA_MET_LEVEL: + retVal = substruct3->metLevel; + break; + case MON_DATA_MET_GAME: + retVal = substruct3->metGame; + break; + case MON_DATA_POKEBALL: + retVal = substruct0->pokeball; + break; + case MON_DATA_OT_GENDER: + retVal = substruct3->otGender; + break; + case MON_DATA_HP_IV: + retVal = substruct3->hpIV; + break; + case MON_DATA_ATK_IV: + retVal = substruct3->attackIV; + break; + case MON_DATA_DEF_IV: + retVal = substruct3->defenseIV; + break; + case MON_DATA_SPEED_IV: + retVal = substruct3->speedIV; + break; + case MON_DATA_SPATK_IV: + retVal = substruct3->spAttackIV; + break; + case MON_DATA_SPDEF_IV: + retVal = substruct3->spDefenseIV; + break; + case MON_DATA_IS_EGG: + retVal = substruct3->isEgg; + break; + case MON_DATA_ABILITY_NUM: + retVal = substruct3->abilityNum; + break; + case MON_DATA_COOL_RIBBON: + retVal = substruct3->coolRibbon; + break; + case MON_DATA_BEAUTY_RIBBON: + retVal = substruct3->beautyRibbon; + break; + case MON_DATA_CUTE_RIBBON: + retVal = substruct3->cuteRibbon; + break; + case MON_DATA_SMART_RIBBON: + retVal = substruct3->smartRibbon; + break; + case MON_DATA_TOUGH_RIBBON: + retVal = substruct3->toughRibbon; + break; + case MON_DATA_CHAMPION_RIBBON: + retVal = substruct3->championRibbon; + break; + case MON_DATA_WINNING_RIBBON: + retVal = substruct3->winningRibbon; + break; + case MON_DATA_VICTORY_RIBBON: + retVal = substruct3->victoryRibbon; + break; + case MON_DATA_ARTIST_RIBBON: + retVal = substruct3->artistRibbon; + break; + case MON_DATA_EFFORT_RIBBON: + retVal = substruct3->effortRibbon; + break; + case MON_DATA_MARINE_RIBBON: + retVal = substruct3->marineRibbon; + break; + case MON_DATA_LAND_RIBBON: + retVal = substruct3->landRibbon; + break; + case MON_DATA_SKY_RIBBON: + retVal = substruct3->skyRibbon; + break; + case MON_DATA_COUNTRY_RIBBON: + retVal = substruct3->countryRibbon; + break; + case MON_DATA_NATIONAL_RIBBON: + retVal = substruct3->nationalRibbon; + break; + case MON_DATA_EARTH_RIBBON: + retVal = substruct3->earthRibbon; + break; + case MON_DATA_WORLD_RIBBON: + retVal = substruct3->worldRibbon; + break; + case MON_DATA_UNUSED_RIBBONS: + retVal = substruct3->unusedRibbons; + break; + case MON_DATA_MODERN_FATEFUL_ENCOUNTER: + retVal = substruct3->modernFatefulEncounter; + break; + case MON_DATA_SPECIES_OR_EGG: + retVal = substruct0->species; + if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) + retVal = SPECIES_EGG; + break; + case MON_DATA_IVS: + retVal = substruct3->hpIV + | (substruct3->attackIV << 5) + | (substruct3->defenseIV << 10) + | (substruct3->speedIV << 15) + | (substruct3->spAttackIV << 20) + | (substruct3->spDefenseIV << 25); + break; + case MON_DATA_KNOWN_MOVES: + if (substruct0->species && !substruct3->isEgg) + { + u16 *moves = (u16 *)data; + s32 i = 0; - while (moves[i] != MOVES_COUNT) - { - u16 move = moves[i]; - if (substruct1->moves[0] == move - || substruct1->moves[1] == move - || substruct1->moves[2] == move - || substruct1->moves[3] == move) - retVal |= gBitTable[i]; - i++; - } - } - break; - case MON_DATA_RIBBON_COUNT: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) + while (moves[i] != MOVES_COUNT) { - retVal += substruct3->coolRibbon; - retVal += substruct3->beautyRibbon; - retVal += substruct3->cuteRibbon; - retVal += substruct3->smartRibbon; - retVal += substruct3->toughRibbon; - retVal += substruct3->championRibbon; - retVal += substruct3->winningRibbon; - retVal += substruct3->victoryRibbon; - retVal += substruct3->artistRibbon; - retVal += substruct3->effortRibbon; - retVal += substruct3->marineRibbon; - retVal += substruct3->landRibbon; - retVal += substruct3->skyRibbon; - retVal += substruct3->countryRibbon; - retVal += substruct3->nationalRibbon; - retVal += substruct3->earthRibbon; - retVal += substruct3->worldRibbon; + u16 move = moves[i]; + if (substruct1->moves[0] == move + || substruct1->moves[1] == move + || substruct1->moves[2] == move + || substruct1->moves[3] == move) + retVal |= gBitTable[i]; + i++; } - break; - case MON_DATA_RIBBONS: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) - { - retVal = substruct3->championRibbon - | (substruct3->coolRibbon << 1) - | (substruct3->beautyRibbon << 4) - | (substruct3->cuteRibbon << 7) - | (substruct3->smartRibbon << 10) - | (substruct3->toughRibbon << 13) - | (substruct3->winningRibbon << 16) - | (substruct3->victoryRibbon << 17) - | (substruct3->artistRibbon << 18) - | (substruct3->effortRibbon << 19) - | (substruct3->marineRibbon << 20) - | (substruct3->landRibbon << 21) - | (substruct3->skyRibbon << 22) - | (substruct3->countryRibbon << 23) - | (substruct3->nationalRibbon << 24) - | (substruct3->earthRibbon << 25) - | (substruct3->worldRibbon << 26); - } - break; - default: - break; } + break; + case MON_DATA_RIBBON_COUNT: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal += substruct3->coolRibbon; + retVal += substruct3->beautyRibbon; + retVal += substruct3->cuteRibbon; + retVal += substruct3->smartRibbon; + retVal += substruct3->toughRibbon; + retVal += substruct3->championRibbon; + retVal += substruct3->winningRibbon; + retVal += substruct3->victoryRibbon; + retVal += substruct3->artistRibbon; + retVal += substruct3->effortRibbon; + retVal += substruct3->marineRibbon; + retVal += substruct3->landRibbon; + retVal += substruct3->skyRibbon; + retVal += substruct3->countryRibbon; + retVal += substruct3->nationalRibbon; + retVal += substruct3->earthRibbon; + retVal += substruct3->worldRibbon; + } + break; + case MON_DATA_RIBBONS: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal = substruct3->championRibbon + | (substruct3->coolRibbon << 1) + | (substruct3->beautyRibbon << 4) + | (substruct3->cuteRibbon << 7) + | (substruct3->smartRibbon << 10) + | (substruct3->toughRibbon << 13) + | (substruct3->winningRibbon << 16) + | (substruct3->victoryRibbon << 17) + | (substruct3->artistRibbon << 18) + | (substruct3->effortRibbon << 19) + | (substruct3->marineRibbon << 20) + | (substruct3->landRibbon << 21) + | (substruct3->skyRibbon << 22) + | (substruct3->countryRibbon << 23) + | (substruct3->nationalRibbon << 24) + | (substruct3->earthRibbon << 25) + | (substruct3->worldRibbon << 26); + } + break; + default: + break; + } } else { @@ -5187,244 +5187,244 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) switch (field) { - case MON_DATA_SPECIES: - { - SET16(substruct0->species); - if (substruct0->species) - boxMon->hasSpecies = TRUE; - else - boxMon->hasSpecies = FALSE; - break; - } - case MON_DATA_HELD_ITEM: - SET16(substruct0->heldItem); - break; - case MON_DATA_EXP: - SET32(substruct0->experience); - break; - case MON_DATA_PP_BONUSES: - SET8(substruct0->ppBonuses); - break; - case MON_DATA_FRIENDSHIP: - SET8(substruct0->friendship); - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - SET16(substruct1->moves[field - MON_DATA_MOVE1]); - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - SET8(substruct1->pp[field - MON_DATA_PP1]); - break; - case MON_DATA_HP_EV: - SET8(substruct2->hpEV); - break; - case MON_DATA_ATK_EV: - SET8(substruct2->attackEV); - break; - case MON_DATA_DEF_EV: - SET8(substruct2->defenseEV); - break; - case MON_DATA_SPEED_EV: - SET8(substruct2->speedEV); - break; - case MON_DATA_SPATK_EV: - SET8(substruct2->spAttackEV); - break; - case MON_DATA_SPDEF_EV: - SET8(substruct2->spDefenseEV); - break; - case MON_DATA_COOL: - SET8(substruct2->cool); - break; - case MON_DATA_BEAUTY: - SET8(substruct2->beauty); - break; - case MON_DATA_CUTE: - SET8(substruct2->cute); - break; - case MON_DATA_SMART: - SET8(substruct2->smart); - break; - case MON_DATA_TOUGH: - SET8(substruct2->tough); - break; - case MON_DATA_SHEEN: - SET8(substruct2->sheen); - break; - case MON_DATA_POKERUS: - SET8(substruct3->pokerus); - break; - case MON_DATA_MET_LOCATION: - SET8(substruct3->metLocation); - break; - case MON_DATA_MET_LEVEL: - { - u8 metLevel = *data; - substruct3->metLevel = metLevel; - break; - } - case MON_DATA_MET_GAME: - SET8(substruct3->metGame); - break; - case MON_DATA_POKEBALL: - { - u8 pokeball = *data; - substruct0->pokeball = pokeball; - break; - } - case MON_DATA_OT_GENDER: - SET8(substruct3->otGender); - break; - case MON_DATA_HP_IV: - SET8(substruct3->hpIV); - break; - case MON_DATA_ATK_IV: - SET8(substruct3->attackIV); - break; - case MON_DATA_DEF_IV: - SET8(substruct3->defenseIV); - break; - case MON_DATA_SPEED_IV: - SET8(substruct3->speedIV); - break; - case MON_DATA_SPATK_IV: - SET8(substruct3->spAttackIV); - break; - case MON_DATA_SPDEF_IV: - SET8(substruct3->spDefenseIV); - break; - case MON_DATA_IS_EGG: - SET8(substruct3->isEgg); - if (substruct3->isEgg) - boxMon->isEgg = TRUE; - else - boxMon->isEgg = FALSE; - break; - case MON_DATA_ABILITY_NUM: - SET8(substruct3->abilityNum); - break; - case MON_DATA_COOL_RIBBON: - SET8(substruct3->coolRibbon); - break; - case MON_DATA_BEAUTY_RIBBON: - SET8(substruct3->beautyRibbon); - break; - case MON_DATA_CUTE_RIBBON: - SET8(substruct3->cuteRibbon); - break; - case MON_DATA_SMART_RIBBON: - SET8(substruct3->smartRibbon); - break; - case MON_DATA_TOUGH_RIBBON: - SET8(substruct3->toughRibbon); - break; - case MON_DATA_CHAMPION_RIBBON: - SET8(substruct3->championRibbon); - break; - case MON_DATA_WINNING_RIBBON: - SET8(substruct3->winningRibbon); - break; - case MON_DATA_VICTORY_RIBBON: - SET8(substruct3->victoryRibbon); - break; - case MON_DATA_ARTIST_RIBBON: - SET8(substruct3->artistRibbon); - break; - case MON_DATA_EFFORT_RIBBON: - SET8(substruct3->effortRibbon); - break; - case MON_DATA_MARINE_RIBBON: - SET8(substruct3->marineRibbon); - break; - case MON_DATA_LAND_RIBBON: - SET8(substruct3->landRibbon); - break; - case MON_DATA_SKY_RIBBON: - SET8(substruct3->skyRibbon); - break; - case MON_DATA_COUNTRY_RIBBON: - SET8(substruct3->countryRibbon); - break; - case MON_DATA_NATIONAL_RIBBON: - SET8(substruct3->nationalRibbon); - break; - case MON_DATA_EARTH_RIBBON: - SET8(substruct3->earthRibbon); - break; - case MON_DATA_WORLD_RIBBON: - SET8(substruct3->worldRibbon); - break; - case MON_DATA_UNUSED_RIBBONS: - SET8(substruct3->unusedRibbons); - break; - case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - SET8(substruct3->modernFatefulEncounter); - break; - case MON_DATA_IVS: - { - u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); - substruct3->hpIV = ivs & MAX_IV_MASK; - substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; - substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; - substruct3->speedIV = (ivs >> 15) & MAX_IV_MASK; - substruct3->spAttackIV = (ivs >> 20) & MAX_IV_MASK; - substruct3->spDefenseIV = (ivs >> 25) & MAX_IV_MASK; - break; - } - default: - break; + case MON_DATA_SPECIES: + { + SET16(substruct0->species); + if (substruct0->species) + boxMon->hasSpecies = TRUE; + else + boxMon->hasSpecies = FALSE; + break; + } + case MON_DATA_HELD_ITEM: + SET16(substruct0->heldItem); + break; + case MON_DATA_EXP: + SET32(substruct0->experience); + break; + case MON_DATA_PP_BONUSES: + SET8(substruct0->ppBonuses); + break; + case MON_DATA_FRIENDSHIP: + SET8(substruct0->friendship); + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + SET16(substruct1->moves[field - MON_DATA_MOVE1]); + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + SET8(substruct1->pp[field - MON_DATA_PP1]); + break; + case MON_DATA_HP_EV: + SET8(substruct2->hpEV); + break; + case MON_DATA_ATK_EV: + SET8(substruct2->attackEV); + break; + case MON_DATA_DEF_EV: + SET8(substruct2->defenseEV); + break; + case MON_DATA_SPEED_EV: + SET8(substruct2->speedEV); + break; + case MON_DATA_SPATK_EV: + SET8(substruct2->spAttackEV); + break; + case MON_DATA_SPDEF_EV: + SET8(substruct2->spDefenseEV); + break; + case MON_DATA_COOL: + SET8(substruct2->cool); + break; + case MON_DATA_BEAUTY: + SET8(substruct2->beauty); + break; + case MON_DATA_CUTE: + SET8(substruct2->cute); + break; + case MON_DATA_SMART: + SET8(substruct2->smart); + break; + case MON_DATA_TOUGH: + SET8(substruct2->tough); + break; + case MON_DATA_SHEEN: + SET8(substruct2->sheen); + break; + case MON_DATA_POKERUS: + SET8(substruct3->pokerus); + break; + case MON_DATA_MET_LOCATION: + SET8(substruct3->metLocation); + break; + case MON_DATA_MET_LEVEL: + { + u8 metLevel = *data; + substruct3->metLevel = metLevel; + break; + } + case MON_DATA_MET_GAME: + SET8(substruct3->metGame); + break; + case MON_DATA_POKEBALL: + { + u8 pokeball = *data; + substruct0->pokeball = pokeball; + break; + } + case MON_DATA_OT_GENDER: + SET8(substruct3->otGender); + break; + case MON_DATA_HP_IV: + SET8(substruct3->hpIV); + break; + case MON_DATA_ATK_IV: + SET8(substruct3->attackIV); + break; + case MON_DATA_DEF_IV: + SET8(substruct3->defenseIV); + break; + case MON_DATA_SPEED_IV: + SET8(substruct3->speedIV); + break; + case MON_DATA_SPATK_IV: + SET8(substruct3->spAttackIV); + break; + case MON_DATA_SPDEF_IV: + SET8(substruct3->spDefenseIV); + break; + case MON_DATA_IS_EGG: + SET8(substruct3->isEgg); + if (substruct3->isEgg) + boxMon->isEgg = TRUE; + else + boxMon->isEgg = FALSE; + break; + case MON_DATA_ABILITY_NUM: + SET8(substruct3->abilityNum); + break; + case MON_DATA_COOL_RIBBON: + SET8(substruct3->coolRibbon); + break; + case MON_DATA_BEAUTY_RIBBON: + SET8(substruct3->beautyRibbon); + break; + case MON_DATA_CUTE_RIBBON: + SET8(substruct3->cuteRibbon); + break; + case MON_DATA_SMART_RIBBON: + SET8(substruct3->smartRibbon); + break; + case MON_DATA_TOUGH_RIBBON: + SET8(substruct3->toughRibbon); + break; + case MON_DATA_CHAMPION_RIBBON: + SET8(substruct3->championRibbon); + break; + case MON_DATA_WINNING_RIBBON: + SET8(substruct3->winningRibbon); + break; + case MON_DATA_VICTORY_RIBBON: + SET8(substruct3->victoryRibbon); + break; + case MON_DATA_ARTIST_RIBBON: + SET8(substruct3->artistRibbon); + break; + case MON_DATA_EFFORT_RIBBON: + SET8(substruct3->effortRibbon); + break; + case MON_DATA_MARINE_RIBBON: + SET8(substruct3->marineRibbon); + break; + case MON_DATA_LAND_RIBBON: + SET8(substruct3->landRibbon); + break; + case MON_DATA_SKY_RIBBON: + SET8(substruct3->skyRibbon); + break; + case MON_DATA_COUNTRY_RIBBON: + SET8(substruct3->countryRibbon); + break; + case MON_DATA_NATIONAL_RIBBON: + SET8(substruct3->nationalRibbon); + break; + case MON_DATA_EARTH_RIBBON: + SET8(substruct3->earthRibbon); + break; + case MON_DATA_WORLD_RIBBON: + SET8(substruct3->worldRibbon); + break; + case MON_DATA_UNUSED_RIBBONS: + SET8(substruct3->unusedRibbons); + break; + case MON_DATA_MODERN_FATEFUL_ENCOUNTER: + SET8(substruct3->modernFatefulEncounter); + break; + case MON_DATA_IVS: + { + u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + substruct3->hpIV = ivs & MAX_IV_MASK; + substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; + substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; + substruct3->speedIV = (ivs >> 15) & MAX_IV_MASK; + substruct3->spAttackIV = (ivs >> 20) & MAX_IV_MASK; + substruct3->spDefenseIV = (ivs >> 25) & MAX_IV_MASK; + break; + } + default: + break; } } else { switch (field) { - case MON_DATA_PERSONALITY: - SET32(boxMon->personality); - break; - case MON_DATA_OT_ID: - SET32(boxMon->otId); - break; - case MON_DATA_NICKNAME: - { - s32 i; - for (i = 0; i < POKEMON_NAME_LENGTH; i++) - boxMon->nickname[i] = data[i]; - break; - } - case MON_DATA_LANGUAGE: - SET8(boxMon->language); - break; - case MON_DATA_SANITY_IS_BAD_EGG: - SET8(boxMon->isBadEgg); - break; - case MON_DATA_SANITY_HAS_SPECIES: - SET8(boxMon->hasSpecies); - break; - case MON_DATA_SANITY_IS_EGG: - SET8(boxMon->isEgg); - break; - case MON_DATA_OT_NAME: - { - s32 i; - for (i = 0; i < PLAYER_NAME_LENGTH; i++) - boxMon->otName[i] = data[i]; - break; - } - case MON_DATA_MARKINGS: - SET8(boxMon->markings); - break; - case MON_DATA_CHECKSUM: - SET16(boxMon->checksum); - break; - case MON_DATA_ENCRYPT_SEPARATOR: - SET16(boxMon->unknown); - break; + case MON_DATA_PERSONALITY: + SET32(boxMon->personality); + break; + case MON_DATA_OT_ID: + SET32(boxMon->otId); + break; + case MON_DATA_NICKNAME: + { + s32 i; + for (i = 0; i < POKEMON_NAME_LENGTH; i++) + boxMon->nickname[i] = data[i]; + break; + } + case MON_DATA_LANGUAGE: + SET8(boxMon->language); + break; + case MON_DATA_SANITY_IS_BAD_EGG: + SET8(boxMon->isBadEgg); + break; + case MON_DATA_SANITY_HAS_SPECIES: + SET8(boxMon->hasSpecies); + break; + case MON_DATA_SANITY_IS_EGG: + SET8(boxMon->isEgg); + break; + case MON_DATA_OT_NAME: + { + s32 i; + for (i = 0; i < PLAYER_NAME_LENGTH; i++) + boxMon->otName[i] = data[i]; + break; + } + case MON_DATA_MARKINGS: + SET8(boxMon->markings); + break; + case MON_DATA_CHECKSUM: + SET16(boxMon->checksum); + break; + case MON_DATA_ENCRYPT_SEPARATOR: + SET16(boxMon->unknown); + break; } } From fc321965a9fcf718e53bb68bc934f4d6f9bd20ee Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 20 Jul 2023 10:14:12 +0100 Subject: [PATCH 074/111] RNG_HITS and RNG_LOADED_DICE --- include/random.h | 2 + src/battle_script_commands.c | 32 ++++--------- src/battle_util.c | 40 +++++----------- test/move_effect_metronome.c | 2 +- test/move_effect_mirror_move.c | 21 ++++---- test/test_runner_battle.c | 87 +++++++++++++++++++++------------- 6 files changed, 86 insertions(+), 98 deletions(-) diff --git a/include/random.h b/include/random.h index 777088005..83bc3e0d5 100644 --- a/include/random.h +++ b/include/random.h @@ -60,8 +60,10 @@ enum RandomTag RNG_FLAME_BODY, RNG_FORCE_RANDOM_SWITCH, RNG_FROZEN, + RNG_HITS, RNG_HOLD_EFFECT_FLINCH, RNG_INFATUATION, + RNG_LOADED_DICE, RNG_METRONOME, RNG_PARALYSIS, RNG_POISON_POINT, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9a9a3c3ae..532a131cc 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12206,30 +12206,14 @@ static void Cmd_setmultihitcounter(void) } else { - #if B_MULTI_HIT_CHANCE >= GEN_5 - // Based on Gen 5's odds - // 35% for 2 hits - // 35% for 3 hits - // 15% for 4 hits - // 15% for 5 hits - gMultiHitCounter = Random() % 100; - if (gMultiHitCounter < 35) - gMultiHitCounter = 2; - else if (gMultiHitCounter < 35 + 35) - gMultiHitCounter = 3; - else if (gMultiHitCounter < 35 + 35 + 15) - gMultiHitCounter = 4; - else - gMultiHitCounter = 5; - #else - // 2 and 3 hits: 37.5% - // 4 and 5 hits: 12.5% - gMultiHitCounter = Random() % 4; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() % 4) + 2; - else - gMultiHitCounter += 2; - #endif + // WARNING: These seem to be unused, see SetRandomMultiHitCounter. + #if B_MULTI_HIT_CHANCE >= GEN_5 + // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. + gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); + #else + // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. + gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); + #endif } } diff --git a/src/battle_util.c b/src/battle_util.c index 495f26cd5..d229bd072 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10899,35 +10899,19 @@ bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move) static void SetRandomMultiHitCounter() { -#if (B_MULTI_HIT_CHANCE >= GEN_5) - // Based on Gen 5's odds - // 35% for 2 hits - // 35% for 3 hits - // 15% for 4 hits - // 15% for 5 hits - gMultiHitCounter = Random() % 100; - if (gMultiHitCounter < 35) - gMultiHitCounter = 2; - else if (gMultiHitCounter < 35 + 35) - gMultiHitCounter = 3; - else if (gMultiHitCounter < 35 + 35 + 15) - gMultiHitCounter = 4; - else - gMultiHitCounter = 5; -#else - // 2 and 3 hits: 37.5% - // 4 and 5 hits: 12.5% - gMultiHitCounter = Random() % 4; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() % 4) + 2; - else - gMultiHitCounter += 2; -#endif - - if (gMultiHitCounter < 4 && GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) { - // If roll 4 or 5 Loaded Dice doesn't do anything. Otherwise it rolls the number of hits as 5 minus a random integer from 0 to 1 inclusive. - gMultiHitCounter = 5 - (Random() & 1); + gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); + } + else + { +#if B_MULTI_HIT_CHANCE >= GEN_5 + // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. + gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); +#else + // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. + gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); +#endif } } diff --git a/test/move_effect_metronome.c b/test/move_effect_metronome.c index 7265d5aa8..1e68603e6 100644 --- a/test/move_effect_metronome.c +++ b/test/move_effect_metronome.c @@ -56,6 +56,6 @@ SINGLE_BATTLE_TEST("Metronome's called multi-hit move hits multiple times") MESSAGE("Wobbuffet used Rock Blast!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_BLAST, player); HP_BAR(opponent); - MESSAGE("Hit 2 time(s)!"); + MESSAGE("Hit 5 time(s)!"); } } diff --git a/test/move_effect_mirror_move.c b/test/move_effect_mirror_move.c index 2b8b9dbe9..ff21c0efa 100644 --- a/test/move_effect_mirror_move.c +++ b/test/move_effect_mirror_move.c @@ -9,8 +9,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Mirror Move copies the last used move by the target") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Speed(2);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(5);} + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_MIRROR_MOVE); } } SCENE { @@ -26,10 +26,10 @@ SINGLE_BATTLE_TEST("Mirror Move copies the last used move by the target") SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Speed(5);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(2);} + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_MIRROR_MOVE); } + TURN { MOVE(player, MOVE_MIRROR_MOVE); MOVE(opponent, MOVE_TACKLE); } } SCENE { MESSAGE("Wobbuffet used Mirror Move!"); MESSAGE("The Mirror Move failed!"); @@ -44,8 +44,8 @@ SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") ASSUME(gBattleMoves[MOVE_STUN_SPORE].flags & FLAG_POWDER); ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); ASSUME(gBattleMoves[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE); - PLAYER(SPECIES_ODDISH) {Speed(5);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(2);} + PLAYER(SPECIES_ODDISH); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STUN_SPORE); MOVE(opponent, MOVE_MIRROR_MOVE); } } SCENE { @@ -59,19 +59,18 @@ SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") } } -// It hits first 2 times, then 5 times with the default rng seed. SINGLE_BATTLE_TEST("Mirror Move's called multi-hit move hits multiple times") { GIVEN { ASSUME(gBattleMoves[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); - PLAYER(SPECIES_WOBBUFFET) {Speed(5);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(2);} + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_BULLET_SEED); MOVE(opponent, MOVE_MIRROR_MOVE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); HP_BAR(opponent); - MESSAGE("Hit 2 time(s)!"); + MESSAGE("Hit 5 time(s)!"); MESSAGE("Foe Wobbuffet used Mirror Move!"); MESSAGE("Foe Wobbuffet used Bullet Seed!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index a2375aef8..9111207c8 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -368,52 +368,40 @@ u32 RandomUniformExcept(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32 PrintTestName(); } STATE->trialRatio = Q_4_12(1) / STATE->trials; - return STATE->runTrial + lo; + + while (reject(STATE->runTrial + lo + STATE->rngTrialOffset)) + { + if (STATE->runTrial + lo + STATE->rngTrialOffset > hi) + Test_ExitWithResult(TEST_RESULT_INVALID, "RandomUniformExcept called with inconsistent reject"); + STATE->rngTrialOffset++; + } + + return STATE->runTrial + lo + STATE->rngTrialOffset; } + default_ = hi; + while (reject(default_)) + { + if (default_ == lo) + Test_ExitWithResult(TEST_RESULT_INVALID, "RandomUniformExcept rejected all values"); + default_--; + } return default_; } u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) { const struct BattlerTurn *turn = NULL; - u32 default_ = n-1; + + if (sum == 0) + Test_ExitWithResult(TEST_RESULT_ERROR, "RandomWeightedArray called with zero sum"); if (gCurrentTurnActionNumber < gBattlersCount) { u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; - } - - if (turn && turn->rng.tag == tag) - { - default_ = turn->rng.value; - } - else - { - switch (tag) - { - case RNG_ACCURACY: - ASSUME(n == 2); - if (turn && turn->hit) - return turn->hit - 1; - default_ = TRUE; - break; - - case RNG_CRITICAL_HIT: - ASSUME(n == 2); - if (turn && turn->criticalHit) - return turn->criticalHit - 1; - default_ = FALSE; - break; - - case RNG_SECONDARY_EFFECT: - ASSUME(n == 2); - if (turn && turn->secondaryEffect) - return turn->secondaryEffect - 1; - default_ = TRUE; - break; - } + if (turn && turn->rng.tag == tag) + return turn->rng.value; } if (tag == STATE->rngTag) @@ -432,7 +420,38 @@ u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) return STATE->runTrial; } - return default_; + switch (tag) + { + case RNG_ACCURACY: + ASSUME(n == 2); + if (turn && turn->hit) + return turn->hit - 1; + else + return TRUE; + + case RNG_CRITICAL_HIT: + ASSUME(n == 2); + if (turn && turn->criticalHit) + return turn->criticalHit - 1; + else + return FALSE; + + case RNG_SECONDARY_EFFECT: + ASSUME(n == 2); + if (turn && turn->secondaryEffect) + return turn->secondaryEffect - 1; + else + return TRUE; + + default: + while (weights[n-1] == 0) + { + if (n == 1) + Test_ExitWithResult(TEST_RESULT_ERROR, "RandomWeightedArray called with all zero weights"); + n--; + } + return n-1; + } } const void *RandomElementArray(enum RandomTag tag, const void *array, size_t size, size_t count) From 6f40d44a23963e1fd089be96fead956d4b34ab7f Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 20 Jul 2023 10:14:25 +0100 Subject: [PATCH 075/111] Cleanup RandomUniform and RandomElementArray --- test/test_runner_battle.c | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 9111207c8..4de144c38 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -307,17 +307,13 @@ static void BattleTest_Run(void *data) u32 RandomUniform(enum RandomTag tag, u32 lo, u32 hi) { const struct BattlerTurn *turn = NULL; - u32 default_ = hi; if (gCurrentTurnActionNumber < gBattlersCount) { u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; - } - - if (turn && turn->rng.tag == tag) - { - default_ = turn->rng.value; + if (turn && turn->rng.tag == tag) + return turn->rng.value; } if (tag == STATE->rngTag) @@ -463,22 +459,17 @@ const void *RandomElementArray(enum RandomTag tag, const void *array, size_t siz { u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; - } - - if (turn && turn->rng.tag == tag) - { - u32 element = 0; - for (index = 0; index < count; index++) - { - memcpy(&element, (const u8 *)array + size * index, size); - if (element == turn->rng.value) - break; - } - if (index == count) + if (turn && turn->rng.tag == tag) { + u32 element = 0; + for (index = 0; index < count; index++) + { + memcpy(&element, (const u8 *)array + size * index, size); + if (element == turn->rng.value) + return (const u8 *)array + size * index; + } // TODO: Incorporate the line number. - const char *filename = gTestRunnerState.test->filename; - Test_ExitWithResult(TEST_RESULT_ERROR, "%s: RandomElement illegal value requested: %d", filename, turn->rng.value); + Test_ExitWithResult(TEST_RESULT_ERROR, "%s: RandomElement illegal value requested: %d", gTestRunnerState.test->filename, turn->rng.value); } } @@ -494,10 +485,8 @@ const void *RandomElementArray(enum RandomTag tag, const void *array, size_t siz Test_ExitWithResult(TEST_RESULT_ERROR, "RandomElement called with inconsistent trials %d and %d", STATE->trials, count); } STATE->trialRatio = Q_4_12(1) / count; - index = STATE->runTrial; + return (const u8 *)array + size * STATE->runTrial; } - - return (const u8 *)array + size * index; } static s32 TryAbilityPopUp(s32 i, s32 n, u32 battlerId, u32 ability) From b53cca1a064d3a565900c9a096f9f6a7779b1dd5 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Mon, 24 Jul 2023 14:57:37 +0100 Subject: [PATCH 076/111] Declarations for 2- and 3-argument GetMonData (#1756) * Type-safe GetMonData/GetBoxMonData * Comments --- include/global.h | 7 +++++++ include/pokemon.h | 17 +++++++++++------ src/daycare.c | 2 +- src/pokemon.c | 16 ++++++++++++++-- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/include/global.h b/include/global.h index 0ca226c03..00b08f48f 100644 --- a/include/global.h +++ b/include/global.h @@ -134,6 +134,13 @@ #define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT) #define NUM_TRENDY_SAYING_BYTES ROUND_BITS_TO_BYTES(NUM_TRENDY_SAYINGS) +// This returns the number of arguments passed to it (up to 8). +#define NARG_8(...) NARG_8_(_, ##__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#define NARG_8_(_, a, b, c, d, e, f, g, h, N, ...) N + +#define CAT(a, b) CAT_(a, b) +#define CAT_(a, b) a ## b + // This produces an error at compile-time if expr is zero. // It looks like file.c:line: size of array `id' is negative #define STATIC_ASSERT(expr, id) typedef char id[(expr) ? 1 : -1]; diff --git a/include/pokemon.h b/include/pokemon.h index 54b4841f7..f4f6d6989 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -436,12 +436,17 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition); void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition); void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPosition); -// These are full type signatures for GetMonData() and GetBoxMonData(), -// but they are not used since some code erroneously omits the third arg. -// u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data); -// u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data); -u32 GetMonData(); -u32 GetBoxMonData(); +/* GameFreak called Get(Box)MonData with either 2 or 3 arguments, for + * type safety we have a Get(Box)MonData macro which dispatches to + * either Get(Box)MonData2 or Get(Box)MonData3 based on the number of + * arguments. The two functions are aliases of each other, but they + * differ for matching purposes in the caller's codegen. */ +#define GetMonData(...) CAT(GetMonData, NARG_8(__VA_ARGS__))(__VA_ARGS__) +#define GetBoxMonData(...) CAT(GetBoxMonData, NARG_8(__VA_ARGS__))(__VA_ARGS__) +u32 GetMonData3(struct Pokemon *mon, s32 field, u8 *data); +u32 GetMonData2(struct Pokemon *mon, s32 field); +u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data); +u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field); void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg); void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg); diff --git a/src/daycare.c b/src/daycare.c index c3f4dd990..9d199f0f3 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -341,7 +341,7 @@ static void Debug_AddDaycareSteps(u16 numSteps) u8 GetNumLevelsGainedFromDaycare(void) { - if (GetBoxMonData(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0) + if (GetBoxMonData(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004].mon, MON_DATA_SPECIES) != 0) return GetNumLevelsGainedForDaycareMon(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004]); return 0; diff --git a/src/pokemon.c b/src/pokemon.c index fa2eee42c..b8f7ae48b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3622,7 +3622,11 @@ static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 perso return substruct; } -u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) +/* GameFreak called GetMonData with either 2 or 3 arguments, for type + * safety we have a GetMonData macro (in include/pokemon.h) which + * dispatches to either GetMonData2 or GetMonData3 based on the number + * of arguments. */ +u32 GetMonData3(struct Pokemon *mon, s32 field, u8 *data) { u32 ret; @@ -3690,7 +3694,13 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) return ret; } -u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) +u32 GetMonData2(struct Pokemon *mon, s32 field) __attribute__((alias("GetMonData3"))); + +/* GameFreak called GetBoxMonData with either 2 or 3 arguments, for type + * safety we have a GetBoxMonData macro (in include/pokemon.h) which + * dispatches to either GetBoxMonData2 or GetBoxMonData3 based on the + * number of arguments. */ +u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) { s32 i; u32 retVal = 0; @@ -4046,6 +4056,8 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) return retVal; } +u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field) __attribute__((alias("GetBoxMonData3"))); + #define SET8(lhs) (lhs) = *data #define SET16(lhs) (lhs) = data[0] + (data[1] << 8) #define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) From 3f5daa8cf138c1849b2b91bba3425250113fa7a7 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Mon, 24 Jul 2023 12:51:43 +0100 Subject: [PATCH 077/111] Add BENCHMARK to test runner Counts the time spent in the block in arbitrary time units (64-cycles currently). If the block takes more than ~4 million cycles (~0.25s) the benchmark will wrap around. Note that the time can be affected by the timeout IRQs, and should only be taken as a loose indication of relative performance. --- include/gba/io_reg.h | 1 + test/random.c | 57 ++++++++++++++++++++++++++++++++++++++++++++ test/test.h | 42 ++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 148ce31db..d05ec7120 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -664,6 +664,7 @@ #define TIMER_64CLK 0x01 #define TIMER_256CLK 0x02 #define TIMER_1024CLK 0x03 +#define TIMER_COUNTUP 0x04 #define TIMER_INTR_ENABLE 0x40 #define TIMER_ENABLE 0x80 diff --git a/test/random.c b/test/random.c index ef364de27..091b9323a 100644 --- a/test/random.c +++ b/test/random.c @@ -151,3 +151,60 @@ TEST("RandomElement generates a uniform distribution") EXPECT_LT(error, UQ_4_12(0.025)); } + +TEST("RandomUniform mul-based faster than mod-based (compile-time)") +{ + u32 i; + struct Benchmark mulBenchmark, modBenchmark; + u32 mulSum = 0, modSum = 0; + + BENCHMARK(&mulBenchmark) + { + mulSum += RandomUniformDefault(RNG_NONE, 0, 1); + mulSum += RandomUniformDefault(RNG_NONE, 0, 2); + mulSum += RandomUniformDefault(RNG_NONE, 0, 3); + mulSum += RandomUniformDefault(RNG_NONE, 0, 4); + } + + BENCHMARK(&modBenchmark) + { + modSum += Random() % 2; + modSum += Random() % 3; + modSum += Random() % 4; + modSum += Random() % 5; + } + + EXPECT_FASTER(mulBenchmark, modBenchmark); + + // Reference mulSum/modSum to prevent optimization. + // These numbers are different because multiplication and modulus + // have subtly different biases (so subtle that it's irrelevant for + // our purposes). + EXPECT_EQ(mulSum, 3); + EXPECT_EQ(modSum, 4); +} + +TEST("RandomUniform mul-based faster than mod-based (run-time)") +{ + u32 i; + struct Benchmark mulBenchmark, modBenchmark; + u32 mulSum = 0, modSum = 0; + + BENCHMARK(&mulBenchmark) + { + for (i = 0; i < 32; i++) + mulSum += RandomUniformDefault(RNG_NONE, 0, i); + } + + BENCHMARK(&modBenchmark) + { + for (i = 0; i < 32; i++) + modSum += Random() % (i + 1); + } + + EXPECT_FASTER(mulBenchmark, modBenchmark); + + // Reference mulSum/modSum to prevent optimization. + EXPECT_EQ(mulSum, 232); + EXPECT_EQ(modSum, 249); +} diff --git a/test/test.h b/test/test.h index 24abca60d..228f19565 100644 --- a/test/test.h +++ b/test/test.h @@ -46,6 +46,7 @@ struct TestRunnerState u8 result; u8 expectedResult; bool8 expectLeaks:1; + bool8 inBenchmark:1; u32 timeoutSeconds; }; @@ -158,6 +159,47 @@ s32 MgbaPrintf_(const char *fmt, ...); Test_ExitWithResult(TEST_RESULT_FAIL, "%s:%d: EXPECT_GE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ } while (0) +struct Benchmark { u32 ticks; }; + +static inline void BenchmarkStart(void) +{ + gTestRunnerState.inBenchmark = TRUE; + REG_TM3CNT = (TIMER_ENABLE | TIMER_64CLK) << 16; +} + +static inline struct Benchmark BenchmarkStop(void) +{ + REG_TM3CNT_H = 0; + gTestRunnerState.inBenchmark = FALSE; + return (struct Benchmark) { REG_TM3CNT_L }; +} + +#define BENCHMARK(id) \ + for (BenchmarkStart(); gTestRunnerState.inBenchmark; *(id) = BenchmarkStop()) + +// An approximation of how much overhead benchmarks introduce. +#define BENCHMARK_ABS 2 + +// An approximation for what percentage faster a benchmark has to be for +// us to be confident that it's faster than another. +#define BENCHMARK_REL 95 + +#define EXPECT_FASTER(a, b) \ + do \ + { \ + u32 a_ = (a).ticks; u32 b_ = (b).ticks; \ + if (((a_ - BENCHMARK_ABS) * BENCHMARK_REL) >= (b_ * 100)) \ + Test_ExitWithResult(TEST_RESULT_FAIL, "%s:%d: EXPECT_FASTER(" #a ", " #b ") failed", gTestRunnerState.test->filename, __LINE__); \ + } while (0) + +#define EXPECT_SLOWER(a, b) \ + do \ + { \ + u32 a_ = (a).ticks; u32 b_ = (b).ticks; \ + if ((a_ * 100) <= ((b_ - BENCHMARK_ABS) * BENCHMARK_REL)) \ + Test_ExitWithResult(TEST_RESULT_FAIL, "%s:%d: EXPECT_SLOWER(" #a ", " #b ") failed", gTestRunnerState.test->filename, __LINE__); \ + } while (0) + #define KNOWN_FAILING \ Test_ExpectedResult(TEST_RESULT_FAIL) From 31a3ada7de629aa28c828762352b1d307113a1bd Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Mon, 24 Jul 2023 19:04:23 +0100 Subject: [PATCH 078/111] Detect potential misalignment in modern --- include/decompress.h | 2 +- include/gba/m4a_internal.h | 2 +- include/gba/macro.h | 83 ++++++++++++++++++++++++++++++++--- include/gba/syscall.h | 22 ++++++++++ include/global.h | 2 +- include/graphics.h | 6 +-- include/item_menu.h | 2 +- include/librfu.h | 2 +- include/link.h | 2 +- include/mon_markings.h | 2 +- include/palette.h | 6 +-- include/scanline_effect.h | 2 +- src/battle_factory_screen.c | 2 +- src/berry_fix_program.c | 2 +- src/contest.c | 4 +- src/decoration.c | 2 +- src/field_weather.c | 6 +-- src/fieldmap.c | 2 +- src/graphics.c | 4 +- src/item_menu.c | 6 +-- src/link.c | 2 +- src/mirage_tower.c | 2 +- src/palette.c | 2 +- src/pokedex_area_region_map.c | 2 +- src/pokemon_storage_system.c | 4 +- src/pokenav_conditions_gfx.c | 4 +- src/pokenav_region_map.c | 2 +- src/rayquaza_scene.c | 4 +- src/scanline_effect.c | 2 +- src/util.c | 2 +- 30 files changed, 142 insertions(+), 45 deletions(-) diff --git a/include/decompress.h b/include/decompress.h index 5e33665b7..18340d54b 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -3,7 +3,7 @@ #include "sprite.h" -extern u8 gDecompressionBuffer[0x4000]; +extern u8 ALIGNED(4) gDecompressionBuffer[0x4000]; void LZDecompressWram(const u32 *src, void *dest); void LZDecompressVram(const u32 *src, void *dest); diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index 40a25ba05..fc8205efd 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -213,7 +213,7 @@ struct SoundInfo ExtVolPitFunc ExtVolPit; u8 gap2[16]; struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; - s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; + s8 ALIGNED(4) pcmBuffer[PCM_DMA_BUF_SIZE * 2]; }; struct SongHeader diff --git a/include/gba/macro.h b/include/gba/macro.h index 3b35a1946..5239cd4c8 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -1,7 +1,7 @@ #ifndef GUARD_GBA_MACRO_H #define GUARD_GBA_MACRO_H -#define CPU_FILL(value, dest, size, bit) \ +#define CPU_FILL_UNCHECKED(value, dest, size, bit) \ { \ vu##bit tmp = (vu##bit)(value); \ CpuSet((void *)&tmp, \ @@ -9,10 +9,33 @@ CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \ } +#if MODERN +#define CPU_FILL(value, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + CPU_FILL_UNCHECKED(value, dest, size, bit); \ + } while (0) +#else +#define CPU_FILL(value, dest, size, bit) CPU_FILL_UNCHECKED(value, dest, size, bit) +#endif + #define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16) #define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32) -#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF)) +#define CPU_COPY_UNCHECKED(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF)) + +#if MODERN +#define CPU_COPY(src, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(src) >= (bit / 8), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + CPU_COPY_UNCHECKED(src, dest, size, bit); \ + } while (0) +#else +#define CPU_COPY(src, dest, size, bit) CPU_COPY_UNCHECKED(src, dest, size, bit) +#endif #define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16) #define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32) @@ -31,7 +54,7 @@ #define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF)) -#define DmaSet(dmaNum, src, dest, control) \ +#define DmaSetUnchecked(dmaNum, src, dest, control) \ { \ vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \ dmaRegs[0] = (vu32)(src); \ @@ -40,7 +63,21 @@ dmaRegs[2]; \ } -#define DMA_FILL(dmaNum, value, dest, size, bit) \ +#if MODERN +// NOTE: Assumes 16-bit DMAs. +#define DmaSet(dmaNum, src, dest, control) \ + do \ + { \ + _Static_assert(_Alignof(src) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & (DMA_32BIT << 16)) ? 4 : 2, 2), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & (DMA_32BIT << 16)) ? 4 : 2, 2), "destination potentially unaligned"); \ + DmaSetUnchecked(dmaNum, src, dest, control); \ + } while (0) +#else +#define DmaSet(dmaNum, src, dest, control) \ + DmaSetUnchecked(dmaNum, src, dest, control) +#endif + +#define DMA_FILL_UNCHECKED(dmaNum, value, dest, size, bit) \ { \ vu##bit tmp = (vu##bit)(value); \ DmaSet(dmaNum, \ @@ -50,6 +87,17 @@ | ((size)/(bit/8))); \ } +#if MODERN +#define DMA_FILL(dmaNum, value, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + DMA_FILL_UNCHECKED(dmaNum, value, dest, size, bit); \ + } while (0) +#else +#define DMA_FILL(dmaNum, value, dest, size, bit) DMA_FILL_UNCHECKED(dmaNum, value, dest, size, bit) +#endif + #define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16) #define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32) @@ -58,23 +106,46 @@ // unit size (2 or 4 bytes) and then combined with the DMA control flags using a // bitwise OR operation. -#define DMA_CLEAR(dmaNum, dest, size, bit) \ +#define DMA_CLEAR_UNCHECKED(dmaNum, dest, size, bit) \ { \ vu##bit *_dest = (vu##bit *)(dest); \ u32 _size = size; \ DmaFill##bit(dmaNum, 0, _dest, _size); \ } +#if MODERN +#define DMA_CLEAR(dmaNum, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + DMA_CLEAR_UNCHECKED(dmaNum, dest, size, bit); \ + } while (0) +#else +#define DMA_CLEAR(dmaNum, dest, size, bit) DMA_CLEAR_UNCHECKED(dmaNum, dest, size, bit) +#endif + #define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16) #define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32) -#define DMA_COPY(dmaNum, src, dest, size, bit) \ +#define DMA_COPY_UNCHECKED(dmaNum, src, dest, size, bit) \ DmaSet(dmaNum, \ src, \ dest, \ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \ | ((size)/(bit/8))) +#if MODERN +#define DMA_COPY(dmaNum, src, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(src) >= (bit / 8), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + DMA_COPY_UNCHECKED(dmaNum, src, dest, size, bit); \ + } while (0) +#else +#define DMA_COPY(dmaNum, src, dest, size, bit) DMA_COPY_UNCHECKED(dmaNum, src, dest, size, bit) +#endif + #define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16) #define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32) diff --git a/include/gba/syscall.h b/include/gba/syscall.h index 56cd4ba58..c922084d5 100644 --- a/include/gba/syscall.h +++ b/include/gba/syscall.h @@ -27,10 +27,32 @@ u16 ArcTan2(s16 x, s16 y); void CpuSet(const void *src, void *dest, u32 control); +#if MODERN +// NOTE: Assumes 16-bit CpuSets unless control is a constant and has +// CPU_SET_32BIT set. +#define CpuSet(src, dest, control) \ + do \ + { \ + _Static_assert(_Alignof(src) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & CPU_SET_32BIT) ? 4 : 2, 2), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & CPU_SET_32BIT) ? 4 : 2, 2), "destination potentially unaligned"); \ + CpuSet(src, dest, control); \ + } while (0) +#endif + #define CPU_FAST_SET_SRC_FIXED 0x01000000 void CpuFastSet(const void *src, void *dest, u32 control); +#if MODERN +#define CpuFastSet(src, dest, control) \ + do \ + { \ + _Static_assert(_Alignof(src) >= 4, "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= 4, "destination potentially unaligned"); \ + CpuFastSet(src, dest, control); \ + } while (0) +#endif + void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count); void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset); diff --git a/include/global.h b/include/global.h index 00b08f48f..e0cecafd0 100644 --- a/include/global.h +++ b/include/global.h @@ -845,7 +845,7 @@ struct WaldaPhrase struct TrainerNameRecord { u32 trainerId; - u8 trainerName[PLAYER_NAME_LENGTH + 1]; + u8 ALIGNED(2) trainerName[PLAYER_NAME_LENGTH + 1]; }; struct TrainerHillSave diff --git a/include/graphics.h b/include/graphics.h index 135eaa95e..04ad64606 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3893,7 +3893,7 @@ extern const u32 gIntroGroudon_Gfx[]; extern const u32 gIntroGroudon_Tilemap[]; extern const u32 gIntroLegendBg_Gfx[]; extern const u32 gIntroGroudonBg_Tilemap[]; -extern const u8 gIntro3Bg_Pal[0x200]; +extern const u8 ALIGNED(2) gIntro3Bg_Pal[0x200]; extern const u32 gIntroKyogre_Gfx[]; extern const u32 gIntroKyogre_Tilemap[]; extern const u32 gIntroKyogreBg_Tilemap[]; @@ -5018,8 +5018,8 @@ extern const u32 gPokenavOptions_Gfx[]; extern const u16 gPokenavOptions_Pal[]; // Battle Factory Screen -extern const u8 gFrontierFactorySelectMenu_Gfx[]; -extern const u8 gFrontierFactorySelectMenu_Tilemap[]; +extern const u16 gFrontierFactorySelectMenu_Gfx[]; +extern const u16 gFrontierFactorySelectMenu_Tilemap[]; extern const u16 gFrontierFactorySelectMenu_Pal[]; // Object event pals diff --git a/include/item_menu.h b/include/item_menu.h index ce03cdacb..09ddd729c 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -78,7 +78,7 @@ struct BagMenu u8 numShownItems[POCKETS_COUNT]; s16 graphicsLoadState; u8 unused2[14]; - u8 pocketNameBuffer[32][32]; + u8 ALIGNED(4) pocketNameBuffer[32][32]; u8 unused3[4]; }; diff --git a/include/librfu.h b/include/librfu.h index 0026adece..6b0bd97c7 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -329,7 +329,7 @@ struct RfuIntrStruct { union RfuPacket rxPacketAlloc; union RfuPacket txPacketAlloc; - u8 block1[0x960]; // size of librfu_intr.s binary + u8 ALIGNED(2) block1[0x960]; // size of librfu_intr.s binary struct STWIStatus block2; }; diff --git a/include/link.h b/include/link.h index f27cddc62..66dd5fecd 100644 --- a/include/link.h +++ b/include/link.h @@ -238,7 +238,7 @@ struct BlockRequest }; extern struct Link gLink; -extern u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; +extern u16 ALIGNED(4) gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; extern u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE]; extern u16 gLinkType; extern u32 gLinkStatus; diff --git a/include/mon_markings.h b/include/mon_markings.h index fda7ad563..dbb53f8e8 100644 --- a/include/mon_markings.h +++ b/include/mon_markings.h @@ -18,7 +18,7 @@ struct MonMarkingsMenu struct Sprite *textSprite; const u8 *frameTiles; const u16 *framePalette; - u8 windowSpriteTiles[0x1000]; + u8 ALIGNED(2) windowSpriteTiles[0x1000]; u8 unused[0x80]; u8 tileLoadState; }; diff --git a/include/palette.h b/include/palette.h index d23a658b4..15c92cc2a 100644 --- a/include/palette.h +++ b/include/palette.h @@ -54,9 +54,9 @@ struct PaletteFadeControl extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; -extern u8 gPaletteDecompressionBuffer[]; -extern u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE]; -extern u16 gPlttBufferFaded[PLTT_BUFFER_SIZE]; +extern u8 ALIGNED(4) gPaletteDecompressionBuffer[]; +extern u16 ALIGNED(4) gPlttBufferUnfaded[PLTT_BUFFER_SIZE]; +extern u16 ALIGNED(4) gPlttBufferFaded[PLTT_BUFFER_SIZE]; void LoadCompressedPalette(const u32 *src, u16 offset, u16 size); void LoadPalette(const void *src, u16 offset, u16 size); diff --git a/include/scanline_effect.h b/include/scanline_effect.h index ae534d969..80d9df764 100644 --- a/include/scanline_effect.h +++ b/include/scanline_effect.h @@ -37,7 +37,7 @@ struct ScanlineEffect extern struct ScanlineEffect gScanlineEffect; -extern u16 gScanlineEffectRegBuffers[2][0x3C0]; +extern u16 ALIGNED(4) gScanlineEffectRegBuffers[2][0x3C0]; void ScanlineEffect_Stop(void); void ScanlineEffect_Clear(void); diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index 081295323..c5633ce28 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -268,7 +268,7 @@ static const u8 sActionHighlightMiddle_Gfx[] = INCBIN_U8( "graphics/battle_front static const u8 sActionHighlightRight_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/action_highlight_right.4bpp"); static const u8 sMonPicBgAnim_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg_anim.4bpp"); static const u8 sMonPicBg_Tilemap[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg.bin"); -static const u8 sMonPicBg_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg.4bpp"); +static const u16 sMonPicBg_Gfx[] = INCBIN_U16("graphics/battle_frontier/factory_screen/mon_pic_bg.4bpp"); static const u16 sMonPicBg_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/mon_pic_bg.gbapal"); static const struct SpriteSheet sSelect_SpriteSheets[] = diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index af21bb929..26af445a0 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -117,7 +117,7 @@ static const struct WindowTemplate sBerryFixWindowTemplates[] = { DUMMY_WIN_TEMPLATE }; -static const u16 sBerryFixPalColors[] = { +static const u16 ALIGNED(4) sBerryFixPalColors[] = { RGB_WHITE, RGB_WHITE, RGB(12, 12, 12), RGB(26, 26, 25), RGB(28, 1, 1), RGB(31, 23, 14), RGB(4, 19, 1), RGB(18, 30, 18), RGB(6, 10, 25), RGB(20, 24, 30), RGB_WHITE, RGB(12, 12, 12), diff --git a/src/contest.c b/src/contest.c index 84d295f13..741a0e12d 100644 --- a/src/contest.c +++ b/src/contest.c @@ -1301,8 +1301,8 @@ static void Task_ReadyStartLinkContest(u8 taskId) static bool8 SetupContestGraphics(u8 *stateVar) { - u16 tempPalette1[16]; - u16 tempPalette2[16]; + u16 ALIGNED(4) tempPalette1[16]; + u16 ALIGNED(4) tempPalette2[16]; switch (*stateVar) { diff --git a/src/decoration.c b/src/decoration.c index 27ef85de9..b33580d2d 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -1916,7 +1916,7 @@ static void CopyPalette(u16 *dest, u16 pal) static void CopyTile(u8 *dest, u16 tile) { - u8 buffer[TILE_SIZE_4BPP]; + u8 ALIGNED(4) buffer[TILE_SIZE_4BPP]; u16 mode; u16 i; diff --git a/src/field_weather.c b/src/field_weather.c index 73aef3746..bcc6a1c44 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -61,7 +61,7 @@ static void None_Main(void); static u8 None_Finish(void); EWRAM_DATA struct Weather gWeather = {0}; -EWRAM_DATA static u8 sFieldEffectPaletteColorMapTypes[32] = {0}; +EWRAM_DATA static u8 ALIGNED(2) sFieldEffectPaletteColorMapTypes[32] = {0}; static const u8 *sPaletteColorMapTypes; @@ -111,7 +111,7 @@ void (*const gWeatherPalStateFuncs[])(void) = // This table specifies which of the color maps should be // applied to each of the background and sprite palettes. -static const u8 sBasePaletteColorMapTypes[32] = +static const u8 ALIGNED(2) sBasePaletteColorMapTypes[32] = { // background palettes COLOR_MAP_DARK_CONTRAST, @@ -149,7 +149,7 @@ static const u8 sBasePaletteColorMapTypes[32] = COLOR_MAP_DARK_CONTRAST, }; -const u16 gFogPalette[] = INCBIN_U16("graphics/weather/fog.gbapal"); +const u16 ALIGNED(4) gFogPalette[] = INCBIN_U16("graphics/weather/fog.gbapal"); void StartWeather(void) { diff --git a/src/fieldmap.c b/src/fieldmap.c index bdacf7ab2..9534255c7 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -25,7 +25,7 @@ struct ConnectionFlags u8 east:1; }; -EWRAM_DATA static u16 sBackupMapData[MAX_MAP_DATA_SIZE] = {0}; +EWRAM_DATA static u16 ALIGNED(4) sBackupMapData[MAX_MAP_DATA_SIZE] = {0}; EWRAM_DATA struct MapHeader gMapHeader = {0}; EWRAM_DATA struct Camera gCamera = {0}; EWRAM_DATA static struct ConnectionFlags sMapConnectionFlags = {0}; diff --git a/src/graphics.c b/src/graphics.c index e8f891d8b..3cfd47ea7 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1219,8 +1219,8 @@ const u32 gRouletteMultiplier_Gfx[] = INCBIN_U32("graphics/roulette/multiplier.4 const u16 gFrontierFactorySelectMenu_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_menu1.gbapal"); const u16 gFrontierFactorySelectMenu_Pal2[] = INCBIN_U16("graphics/battle_frontier/factory_menu2.gbapal"); -const u8 gFrontierFactorySelectMenu_Gfx[] = INCBIN_U8("graphics/battle_frontier/factory_menu1.4bpp"); -const u8 gFrontierFactorySelectMenu_Gfx2[] = INCBIN_U8("graphics/battle_frontier/factory_menu2.4bpp"); +const u16 gFrontierFactorySelectMenu_Gfx[] = INCBIN_U16("graphics/battle_frontier/factory_menu1.4bpp"); +const u16 gFrontierFactorySelectMenu_Gfx2[] = INCBIN_U16("graphics/battle_frontier/factory_menu2.4bpp"); const u16 gFrontierFactorySelectMenu_Tilemap[] = INCBIN_U16("graphics/battle_frontier/factory_menu.bin"); diff --git a/src/item_menu.c b/src/item_menu.c index 00449c6ec..223f028d0 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -2429,16 +2429,16 @@ static void PrintPocketNames(const u8 *pocketName1, const u8 *pocketName2) static void CopyPocketNameToWindow(u32 a) { - u8 (* tileDataBuffer)[32][32]; + u8 (*tileDataBuffer)[32][32]; u8 *windowTileData; int b; if (a > 8) a = 8; tileDataBuffer = &gBagMenu->pocketNameBuffer; windowTileData = (u8 *)GetWindowAttribute(2, WINDOW_TILE_DATA); - CpuCopy32(tileDataBuffer[0][a], windowTileData, 0x100); // Top half of pocket name + CpuCopy32(&tileDataBuffer[0][a], windowTileData, 0x100); // Top half of pocket name b = a + 16; - CpuCopy32(tileDataBuffer[0][b], windowTileData + 0x100, 0x100); // Bottom half of pocket name + CpuCopy32(&tileDataBuffer[0][b], windowTileData + 0x100, 0x100); // Bottom half of pocket name CopyWindowToVram(WIN_POCKET_NAME, COPYWIN_GFX); } diff --git a/src/link.c b/src/link.c index 0894021b5..c51abc952 100644 --- a/src/link.c +++ b/src/link.c @@ -78,7 +78,7 @@ bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS]; u8 gBlockReceivedStatus[MAX_LINK_PLAYERS]; u32 gLinkFiller2; u16 gLinkHeldKeys; -u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; +u16 ALIGNED(4) gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; u32 gLinkStatus; bool8 gLinkDummy1; // Never read bool8 gLinkDummy2; // Never read diff --git a/src/mirage_tower.c b/src/mirage_tower.c index f9806e776..9b48ee24b 100644 --- a/src/mirage_tower.c +++ b/src/mirage_tower.c @@ -75,7 +75,7 @@ static void Task_FossilFallAndSink(u8); static void SpriteCB_FallingFossil(struct Sprite *); static void UpdateDisintegrationEffect(u8 *, u16, u8, u8, u8); -static const u8 sBlankTile_Gfx[32] = {0}; +static const u8 ALIGNED(2) sBlankTile_Gfx[32] = {0}; static const u8 sMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp"); static const u16 sMirageTowerTilemap[] = INCBIN_U16("graphics/misc/mirage_tower.bin"); static const u16 sFossil_Pal[] = INCBIN_U16("graphics/object_events/pics/misc/fossil.gbapal"); // Unused diff --git a/src/palette.c b/src/palette.c index 6ce47a493..43a4c213c 100644 --- a/src/palette.c +++ b/src/palette.c @@ -64,7 +64,7 @@ static EWRAM_DATA struct PaletteStruct sPaletteStructs[NUM_PALETTE_STRUCTS] = {0 EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; static EWRAM_DATA u32 sFiller = 0; static EWRAM_DATA u32 sPlttBufferTransferPending = 0; -EWRAM_DATA u8 gPaletteDecompressionBuffer[PLTT_SIZE] = {0}; +EWRAM_DATA u8 ALIGNED(2) gPaletteDecompressionBuffer[PLTT_SIZE] = {0}; static const struct PaletteStructTemplate sDummyPaletteStructTemplate = { .id = 0xFFFF, diff --git a/src/pokedex_area_region_map.c b/src/pokedex_area_region_map.c index da50f8c68..cd2975473 100644 --- a/src/pokedex_area_region_map.c +++ b/src/pokedex_area_region_map.c @@ -8,7 +8,7 @@ static EWRAM_DATA u8 *sPokedexAreaMapBgNum = NULL; -static const u16 sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/pokedex/region_map.gbapal"); +static const u16 ALIGNED(4) sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/pokedex/region_map.gbapal"); static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/pokedex/region_map.8bpp.lz"); static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map.bin.lz"); static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/pokedex/region_map_affine.8bpp.lz"); diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 99b0dae0e..9db0d77c6 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -550,8 +550,8 @@ struct PokemonStorageSystemData u16 *displayMonTilePtr; struct Sprite *displayMonSprite; u16 displayMonPalBuffer[0x40]; - u8 tileBuffer[MON_PIC_SIZE * MAX_MON_PIC_FRAMES]; - u8 itemIconBuffer[0x800]; + u8 ALIGNED(4) tileBuffer[MON_PIC_SIZE * MAX_MON_PIC_FRAMES]; + u8 ALIGNED(4) itemIconBuffer[0x800]; u8 wallpaperBgTilemapBuffer[0x1000]; u8 displayMenuTilemapBuffer[0x800]; }; diff --git a/src/pokenav_conditions_gfx.c b/src/pokenav_conditions_gfx.c index e382cbf69..9f4b2db61 100644 --- a/src/pokenav_conditions_gfx.c +++ b/src/pokenav_conditions_gfx.c @@ -116,10 +116,12 @@ static const LoopedTask sLoopedTaskFuncs[] = [CONDITION_FUNC_CLOSE_MARKINGS] = LoopedTask_CloseMonMarkingsWindow }; +typedef u8 ALIGNED(4) TilemapBuffer[BG_SCREEN_SIZE]; + struct Pokenav_ConditionMenuGfx { u32 loopedTaskId; - u8 tilemapBuffers[3][BG_SCREEN_SIZE]; + TilemapBuffer tilemapBuffers[3]; u8 filler[2]; u8 partyPokeballSpriteIds[PARTY_SIZE + 1]; u32 (*callback)(void); diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c index e589e2818..f81ff4296 100755 --- a/src/pokenav_region_map.c +++ b/src/pokenav_region_map.c @@ -35,7 +35,7 @@ struct Pokenav_RegionMapGfx u32 loopTaskId; u16 infoWindowId; struct Sprite *cityZoomTextSprites[3]; - u8 tilemapBuffer[BG_SCREEN_SIZE]; + u8 ALIGNED(2) tilemapBuffer[BG_SCREEN_SIZE]; u8 cityZoomPics[NUM_CITY_MAPS][200]; }; diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index c984dfec8..cacadf528 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -60,10 +60,12 @@ enum #define MAX_SMOKE 10 +typedef u8 ALIGNED(4) TilemapBuffer[BG_SCREEN_SIZE]; + struct RayquazaScene { MainCallback exitCallback; - u8 tilemapBuffers[4][BG_SCREEN_SIZE]; + TilemapBuffer tilemapBuffers[4]; u16 unk; // never read u8 animId; bool8 endEarly; diff --git a/src/scanline_effect.c b/src/scanline_effect.c index dc3ca03f4..684c89546 100644 --- a/src/scanline_effect.c +++ b/src/scanline_effect.c @@ -13,7 +13,7 @@ static void CopyValue32Bit(void); // Per-scanline register values. // This is double buffered so that it can be safely written to at any time // without overwriting the buffer that the DMA is currently reading -EWRAM_DATA u16 gScanlineEffectRegBuffers[2][0x3C0] = {0}; +EWRAM_DATA u16 ALIGNED(4) gScanlineEffectRegBuffers[2][0x3C0] = {0}; EWRAM_DATA struct ScanlineEffect gScanlineEffect = {0}; EWRAM_DATA static bool8 sShouldStopWaveTask = FALSE; diff --git a/src/util.c b/src/util.c index 32f31a26d..ab5603b86 100644 --- a/src/util.c +++ b/src/util.c @@ -158,7 +158,7 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) { u8 x, y; s8 i, j; - u8 xflip[32]; + u8 ALIGNED(4) xflip[32]; u8 h = sSpriteDimensions[shape][size][1]; u8 w = sSpriteDimensions[shape][size][0]; From b499f41a5cc232369b518206619d1d96a5a0fd62 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 25 Jul 2023 07:40:51 +0100 Subject: [PATCH 079/111] Print ticks --- test/test.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test.h b/test/test.h index 228f19565..5b3ab8af0 100644 --- a/test/test.h +++ b/test/test.h @@ -159,7 +159,7 @@ s32 MgbaPrintf_(const char *fmt, ...); Test_ExitWithResult(TEST_RESULT_FAIL, "%s:%d: EXPECT_GE(%d, %d) failed", gTestRunnerState.test->filename, __LINE__, _a, _b); \ } while (0) -struct Benchmark { u32 ticks; }; +struct Benchmark { s32 ticks; }; static inline void BenchmarkStart(void) { @@ -188,6 +188,7 @@ static inline struct Benchmark BenchmarkStop(void) do \ { \ u32 a_ = (a).ticks; u32 b_ = (b).ticks; \ + MgbaPrintf_(#a ": %d ticks, " #b ": %d ticks", a_, b_); \ if (((a_ - BENCHMARK_ABS) * BENCHMARK_REL) >= (b_ * 100)) \ Test_ExitWithResult(TEST_RESULT_FAIL, "%s:%d: EXPECT_FASTER(" #a ", " #b ") failed", gTestRunnerState.test->filename, __LINE__); \ } while (0) @@ -196,6 +197,7 @@ static inline struct Benchmark BenchmarkStop(void) do \ { \ u32 a_ = (a).ticks; u32 b_ = (b).ticks; \ + MgbaPrintf_(#a ": %d ticks, " #b ": %d ticks", a_, b_); \ if ((a_ * 100) <= ((b_ - BENCHMARK_ABS) * BENCHMARK_REL)) \ Test_ExitWithResult(TEST_RESULT_FAIL, "%s:%d: EXPECT_SLOWER(" #a ", " #b ") failed", gTestRunnerState.test->filename, __LINE__); \ } while (0) From da9b421ae1df86345dc3bb7f5e1ea82b13e35c76 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 25 Jul 2023 09:59:26 +0200 Subject: [PATCH 080/111] Fix Ruin ability calcs (#3171) --- src/battle_util.c | 8 ++--- test/ability_beads_of_ruin.c | 53 ++++++++++++++++++++++++++++++++++ test/ability_sword_of_ruin.c | 53 ++++++++++++++++++++++++++++++++++ test/ability_tablets_of_ruin.c | 53 ++++++++++++++++++++++++++++++++++ test/ability_vessel_of_ruin.c | 53 ++++++++++++++++++++++++++++++++++ 5 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 test/ability_beads_of_ruin.c create mode 100644 test/ability_sword_of_ruin.c create mode 100644 test/ability_tablets_of_ruin.c create mode 100644 test/ability_vessel_of_ruin.c diff --git a/src/battle_util.c b/src/battle_util.c index 0a2a99447..d549b71b9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8908,16 +8908,16 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe } if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && atkAbility != ABILITY_VESSEL_OF_RUIN && IS_MOVE_SPECIAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + MulModifier(&modifier, UQ_4_12(0.75)); if (IsAbilityOnField(ABILITY_SWORD_OF_RUIN) && defAbility != ABILITY_SWORD_OF_RUIN && IS_MOVE_PHYSICAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + MulModifier(&modifier, UQ_4_12(1.25)); if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && atkAbility != ABILITY_TABLETS_OF_RUIN && IS_MOVE_PHYSICAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + MulModifier(&modifier, UQ_4_12(0.75)); if (IsAbilityOnField(ABILITY_BEADS_OF_RUIN) && defAbility != ABILITY_BEADS_OF_RUIN && IS_MOVE_SPECIAL(gCurrentMove)) - MulModifier(&modifier, UQ_4_12(0.25)); + MulModifier(&modifier, UQ_4_12(1.25)); // attacker partner's abilities if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) diff --git a/test/ability_beads_of_ruin.c b/test/ability_beads_of_ruin.c new file mode 100644 index 000000000..28b39a430 --- /dev/null +++ b/test/ability_beads_of_ruin.c @@ -0,0 +1,53 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_WATER_GUN].split == SPLIT_SPECIAL); +} + +SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_BEADS_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WATER_GUN); } + } SCENE { + if (ability == ABILITY_BEADS_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_BEADS_OF_RUIN); + MESSAGE("Wobbuffet's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); + } + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.25), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Beads of Ruin does not reduce Sp. Def if opposing mon has the same ability", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_BEADS_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_BEADS_OF_RUIN); } + } WHEN { + TURN { MOVE(player, MOVE_WATER_GUN); } + } SCENE { + if (ability == ABILITY_BEADS_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_BEADS_OF_RUIN); + MESSAGE("Wobbuffet's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); + } + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} diff --git a/test/ability_sword_of_ruin.c b/test/ability_sword_of_ruin.c new file mode 100644 index 000000000..6ec4f8fe8 --- /dev/null +++ b/test/ability_sword_of_ruin.c @@ -0,0 +1,53 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL); +} + +SINGLE_BATTLE_TEST("Sword of Ruin reduces Defense", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_SWORD_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + if (ability == ABILITY_SWORD_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_SWORD_OF_RUIN); + MESSAGE("Wobbuffet's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); + } + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.25), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Sword of Ruin does not reduce Defense if opposing mon has the same ability", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_SWORD_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SWORD_OF_RUIN); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + if (ability == ABILITY_SWORD_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_SWORD_OF_RUIN); + MESSAGE("Wobbuffet's Sword of Ruin weakened the Defense of all surrounding PokΓ©mon!"); + } + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} diff --git a/test/ability_tablets_of_ruin.c b/test/ability_tablets_of_ruin.c new file mode 100644 index 000000000..38dcfc856 --- /dev/null +++ b/test/ability_tablets_of_ruin.c @@ -0,0 +1,53 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL); +} + +SINGLE_BATTLE_TEST("Tablets of Ruin reduces Attack", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_TABLETS_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + if (ability == ABILITY_TABLETS_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_TABLETS_OF_RUIN); + MESSAGE("Wobbuffet's Tablets of Ruin weakened the Attack of all surrounding PokΓ©mon!"); + } + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.75), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Tablets of Ruin does not reduce Attack if an opposing mon has the same ability", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_TABLETS_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TABLETS_OF_RUIN); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + if (ability == ABILITY_TABLETS_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_TABLETS_OF_RUIN); + MESSAGE("Wobbuffet's Tablets of Ruin weakened the Attack of all surrounding PokΓ©mon!"); + } + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} diff --git a/test/ability_vessel_of_ruin.c b/test/ability_vessel_of_ruin.c new file mode 100644 index 000000000..6c7b2664f --- /dev/null +++ b/test/ability_vessel_of_ruin.c @@ -0,0 +1,53 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_WATER_GUN].split == SPLIT_SPECIAL); +} + +SINGLE_BATTLE_TEST("Vessel of Ruin reduces Sp. Atk", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_VESSEL_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + if (ability == ABILITY_VESSEL_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_VESSEL_OF_RUIN); + MESSAGE("Wobbuffet's Vessel of Ruin weakened the Sp. Atk of all surrounding PokΓ©mon!"); + } + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.75), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Vessel of Ruin does not reduce Sp. Atk if opposing mon has the same ability", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_VESSEL_OF_RUIN; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_VESSEL_OF_RUIN); } + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + if (ability == ABILITY_VESSEL_OF_RUIN) { + ABILITY_POPUP(player, ABILITY_VESSEL_OF_RUIN); + MESSAGE("Wobbuffet's Vessel of Ruin weakened the Sp. Atk of all surrounding PokΓ©mon!"); + } + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} From c11839c648c402cae731c16fcd347252e0e0197e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 26 Jul 2023 09:34:23 +0200 Subject: [PATCH 081/111] Use isValidForBattle --- src/battle_ai_switch_items.c | 46 ++++++++---------------------------- 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 625634af4..d815d3f8b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -113,11 +113,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) // Find a Pokemon in the party that has a super effective move. for (i = firstId; i < lastId; i++) { - if (GetMonData(&party[i], MON_DATA_HP) == 0) - continue; - if (GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) - continue; - if (GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) + if (!IsValidForBattle(&party[i])) continue; if (i == gBattlerPartyIndexes[gActiveBattler]) continue; @@ -196,13 +192,9 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) for (i = firstId; i < lastId; i++) { - u16 species; u16 monAbility; - if (GetMonData(&party[i], MON_DATA_HP) == 0) - continue; - species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - if (species == SPECIES_NONE || species == SPECIES_EGG) + if (!IsValidForBattle(&party[i])) continue; if (i == gBattlerPartyIndexes[battlerIn1]) continue; @@ -216,7 +208,6 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) continue; monAbility = GetMonAbility(&party[i]); - if (absorbingTypeAbility == monAbility && Random() & 1) { // we found a mon. @@ -291,9 +282,7 @@ static bool8 ShouldSwitchIfGameStatePrompt(void) continue; //Look for mon in party that is able to be switched into and has ability that sets terrain - if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG + if (IsValidForBattle(&party[i]) && i != gBattlerPartyIndexes[gActiveBattler] && i != gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)] && IsBattlerGrounded(gActiveBattler) @@ -562,13 +551,9 @@ static bool8 FindMonWithFlagsAndSuperEffective(u16 flags, u8 moduloPercent) for (i = firstId; i < lastId; i++) { - u16 species; - u16 monAbility; + u16 species, monAbility; - if (GetMonData(&party[i], MON_DATA_HP) == 0) - continue; - species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - if (species == SPECIES_NONE || species == SPECIES_EGG) + if (!IsValidForBattle(&party[i])) continue; if (i == gBattlerPartyIndexes[battlerIn1]) continue; @@ -581,8 +566,8 @@ static bool8 FindMonWithFlagsAndSuperEffective(u16 flags, u8 moduloPercent) if (IsAceMon(gActiveBattler, i)) continue; + species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); monAbility = GetMonAbility(&party[i]); - CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[gActiveBattler], species, monAbility); if (gMoveResultFlags & flags) { @@ -651,11 +636,7 @@ bool32 ShouldSwitch(void) for (i = firstId; i < lastId; i++) { - if (GetMonData(&party[i], MON_DATA_HP) == 0) - continue; - if (GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) - continue; - if (GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) + if (!IsValidForBattle(&party[i])) continue; if (i == gBattlerPartyIndexes[battlerIn1]) continue; @@ -752,9 +733,7 @@ void AI_TrySwitchOrUseItem(void) for (monToSwitchId = (lastId-1); monToSwitchId >= firstId; monToSwitchId--) { - if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0) - continue; - if (GetMonData(&party[monToSwitchId], MON_DATA_SPECIES) == SPECIES_NONE) + if (!IsValidForBattle(&party[monToSwitchId])) continue; if (monToSwitchId == gBattlerPartyIndexes[battlerIn1]) continue; @@ -957,10 +936,7 @@ u8 GetMostSuitableMonToSwitchInto(void) // Get invalid slots ids. for (i = firstId; i < lastId; i++) { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - if (species == SPECIES_NONE - || species == SPECIES_EGG - || GetMonData(&party[i], MON_DATA_HP) == 0 + if (!IsValidForBattle(&party[i]) || gBattlerPartyIndexes[battlerIn1] == i || gBattlerPartyIndexes[battlerIn2] == i || i == *(gBattleStruct->monToSwitchIntoId + battlerIn1) @@ -1043,9 +1019,7 @@ static bool8 ShouldUseItem(void) for (i = 0; i < PARTY_SIZE; i++) { - if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) + if (IsValidForBattle(&party[i])) { validMons++; } From 6f31314c4aed40eb27c7dc2dd58c5fb34964cebd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 26 Jul 2023 09:42:29 +0200 Subject: [PATCH 082/111] Fix uturn typo in test --- test/ability_rattled.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ability_rattled.c b/test/ability_rattled.c index bddc88751..493e3cfca 100644 --- a/test/ability_rattled.c +++ b/test/ability_rattled.c @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Rattled triggers correctly when hit by U-Turn") // Specific } WHEN { TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 1); } } SCENE { - MESSAGE("Wobbuffet used U-Turn!"); + MESSAGE("Wobbuffet used U-turn!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); HP_BAR(opponent); ABILITY_POPUP(opponent, ABILITY_RATTLED); From bca29d8586cce1b7d8af6e2174fa895590a3cc53 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 26 Jul 2023 17:17:33 +0200 Subject: [PATCH 083/111] Adds Mortal Spin and Population Bomb --- data/battle_scripts_1.s | 13 ++++++++++++- include/constants/battle_move_effects.h | 4 +++- src/battle_ai_main.c | 2 ++ src/battle_ai_util.c | 2 +- src/battle_script_commands.c | 6 +++--- src/battle_util.c | 5 ----- src/data/battle_moves.h | 9 ++++++--- test/move_effect_mortal_spin.c | 24 ++++++++++++++++++++++++ 8 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 test/move_effect_mortal_spin.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ec6958d94..db0cebc4b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -435,6 +435,17 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_COLLISION_COURSE .4byte BattleScript_EffectSpinOut @ EFFECT_SPIN_OUT .4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN + .4byte BattleScript_EffectHit @ EFFECT_POPULATION_BOMB + .4byte BattleScript_EffectMortalSpin @ EFFECT_MORTAL_SPIN + +BattleScript_EffectMortalSpin: + call BattleScript_EffectHit_Ret + rapidspinfree + setmoveeffect MOVE_EFFECT_POISON + seteffectwithchance + tryfaintmon BS_TARGET + moveendall + end BattleScript_EffectMakeItRain: setmoveeffect MOVE_EFFECT_PAYDAY @@ -7790,7 +7801,7 @@ BattleScript_WishMegaEvolution:: BattleScript_PrimalReversion:: call BattleScript_PrimalReversionRet end2 - + BattleScript_PrimalReversionRestoreAttacker:: call BattleScript_PrimalReversionRet copybyte gBattlerAttacker, sSAVED_BATTLER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index bb38d8659..c12f6fbc0 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -412,7 +412,9 @@ #define EFFECT_COLLISION_COURSE 406 #define EFFECT_SPIN_OUT 407 #define EFFECT_MAKE_IT_RAIN 408 +#define EFFECT_POPULATION_BOMB 409 +#define EFFECT_MORTAL_SPIN 410 -#define NUM_BATTLE_MOVE_EFFECTS 409 +#define NUM_BATTLE_MOVE_EFFECTS 411 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 9243bacb9..e231d3d1f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3571,6 +3571,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_TOXIC: case EFFECT_POISON: case EFFECT_BARB_BARRAGE: + case EFFECT_MORTAL_SPIN: IncreasePoisonScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_LIGHT_SCREEN: @@ -4246,6 +4247,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } break; case MOVE_RAPID_SPIN: + case MOVE_MORTAL_SPIN: if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED) score += 3; break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c18209314..dcf653d41 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -865,7 +865,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness, } // Handle other multi-strike moves - if (gBattleMoves[move].strikeCount > 1) + if (gBattleMoves[move].strikeCount > 1 && gBattleMoves[move].effect != EFFECT_TRIPLE_KICK) dmg *= gBattleMoves[move].strikeCount; else if (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) dmg *= 3; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1059967ed..36965c465 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1722,10 +1722,10 @@ static void Cmd_accuracycheck(void) gBattlescriptCurrInstr = cmd->nextInstr; } else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT - || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (gBattleMoves[move].effect != EFFECT_TRIPLE_KICK - || GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK))) + || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK + || !(gBattleMoves[move].effect == EFFECT_TRIPLE_KICK || gBattleMoves[move].effect == EFFECT_POPULATION_BOMB)))) { - // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel + // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel/Population Bomb gBattlescriptCurrInstr = cmd->nextInstr; } else diff --git a/src/battle_util.c b/src/battle_util.c index 1170ddea7..e64cc5019 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3748,11 +3748,6 @@ u8 AtkCanceller_UnableToUseMove(void) gMultiHitCounter = gBattleMoves[gCurrentMove].strikeCount; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } - else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK) - { - gMultiHitCounter = 3; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) - } #if B_BEAT_UP >= GEN_5 else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP) { diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index bb1db2f7d..4e03d68c5 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -2886,6 +2886,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, + .strikeCount = 3, }, [MOVE_THIEF] = @@ -12357,6 +12358,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, + .strikeCount = 3, }, [MOVE_DUAL_WINGBEAT] = @@ -13152,7 +13154,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_POPULATION_BOMB] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_MULTI_HIT maybe? + .effect = EFFECT_POPULATION_BOMB, .power = 20, .type = TYPE_NORMAL, .accuracy = 90, @@ -13165,6 +13167,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .makesContact = TRUE, .slicingMove = TRUE, .metronomeBanned = TRUE, + .strikeCount = 10, }, [MOVE_ICE_SPINNER] = @@ -13246,12 +13249,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_MORTAL_SPIN] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_MORTAL_SPIN + .effect = EFFECT_MORTAL_SPIN, .power = 30, .type = TYPE_POISON, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .split = SPLIT_PHYSICAL, diff --git a/test/move_effect_mortal_spin.c b/test/move_effect_mortal_spin.c new file mode 100644 index 000000000..c3dd04527 --- /dev/null +++ b/test/move_effect_mortal_spin.c @@ -0,0 +1,24 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_MORTAL_SPIN].effect == EFFECT_MORTAL_SPIN); +} + +SINGLE_BATTLE_TEST("Mortal Spin blows away hazards and poisons foe") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); MOVE(player, MOVE_MORTAL_SPIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MORTAL_SPIN, player); + MESSAGE("Wobbuffet blew away Stealth Rock!"); + MESSAGE("Foe Wobbuffet was poisoned!"); + STATUS_ICON(opponent, poison: TRUE); + } +} + From 1baa57418ed087df597ebb4d5d8ab36fbc840fb0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 27 Jul 2023 03:33:01 +0200 Subject: [PATCH 084/111] Fixed copyright screen not showing up on certain emulators (#2664) * Fix old intro not showing up on VBA * Update intro.c * Update intro.c * Update intro.c --- src/intro.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/intro.c b/src/intro.c index bfc23a74b..28b4120b1 100644 --- a/src/intro.c +++ b/src/intro.c @@ -1096,6 +1096,10 @@ static u8 SetUpCopyrightScreen(void) REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; SetSerialCallback(SerialCB_CopyrightScreen); GameCubeMultiBoot_Init(&gMultibootProgramStruct); + // REG_DISPCNT needs to be overwritten the second time, because otherwise the intro won't show up on VBA 1.7.2 and John GBA Lite emulators. + // The REG_DISPCNT overwrite is NOT needed in m-GBA, No$GBA, VBA 1.8.0, My Boy and Pizza Boy GBA emulators. + case 1: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; default: UpdatePaletteFade(); gMain.state++; From 5fa7a6d4c6710e0a447358fd8e4b8ccb49969619 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 28 Jul 2023 13:20:06 +0200 Subject: [PATCH 085/111] Skill Link Tests, Loaded Dice stuff --- src/battle_script_commands.c | 3 +- src/battle_util.c | 11 +- test/move_effect_multi_hit.c | 135 ++++++++++++++++++ test/move_effect_population_bomb.c | 6 + test/move_effect_triple_kick.c | 6 +- ...ree_strikes.c => move_flag_strike_count.c} | 17 ++- 6 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 test/move_effect_multi_hit.c create mode 100644 test/move_effect_population_bomb.c rename test/{move_flag_three_strikes.c => move_flag_strike_count.c} (76%) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 36965c465..6a3ccde0c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1722,7 +1722,8 @@ static void Cmd_accuracycheck(void) gBattlescriptCurrInstr = cmd->nextInstr; } else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT - || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK + || (gSpecialStatuses[gBattlerAttacker].multiHitOn + && (GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK || GetBattlerHoldEffect(gBattlerAttacker, TRUE) || !(gBattleMoves[move].effect == EFFECT_TRIPLE_KICK || gBattleMoves[move].effect == EFFECT_POPULATION_BOMB)))) { // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel/Population Bomb diff --git a/src/battle_util.c b/src/battle_util.c index e64cc5019..a84521f11 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3745,8 +3745,15 @@ u8 AtkCanceller_UnableToUseMove(void) } else if (gBattleMoves[gCurrentMove].strikeCount > 1) { - gMultiHitCounter = gBattleMoves[gCurrentMove].strikeCount; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) + if (gBattleMoves[gCurrentMove].effect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) + { + gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); + } + else + { + gMultiHitCounter = gBattleMoves[gCurrentMove].strikeCount; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) + } } #if B_BEAT_UP >= GEN_5 else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP) diff --git a/test/move_effect_multi_hit.c b/test/move_effect_multi_hit.c new file mode 100644 index 000000000..d3a265ebb --- /dev/null +++ b/test/move_effect_multi_hit.c @@ -0,0 +1,135 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit the maximum amount with Skill Link") +{ + PASSES_RANDOMLY(100, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SKILL_LINK); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 5 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit twice 35 Percent of the time") +{ + PASSES_RANDOMLY(35, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 2 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 35 Percent of the time") +{ + PASSES_RANDOMLY(35, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 3 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit four times 35 Percent of the time") +{ + PASSES_RANDOMLY(15, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 4 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit four times 35 Percent of the time") +{ + PASSES_RANDOMLY(15, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 5 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit at least four times with Loaded Dice") +{ + PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE); + + GIVEN { + ASSUME(gItems[ITEM_LOADED_DICE].holdEffect == HOLD_EFFECT_LOADED_DICE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 4 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit five times 50 Percent of the time with Loaded Dice") +{ + PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE); + + GIVEN { + ASSUME(gItems[ITEM_LOADED_DICE].holdEffect == HOLD_EFFECT_LOADED_DICE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 5 time(s)!"); + } +} diff --git a/test/move_effect_population_bomb.c b/test/move_effect_population_bomb.c new file mode 100644 index 000000000..439cbe809 --- /dev/null +++ b/test/move_effect_population_bomb.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test_battle.h" + +TO_DO_BATTLE_TEST("Accuracy for Population Bomb is checked independently for each hit") +TO_DO_BATTLE_TEST("Accuracy for Population Bomb is only checked for the first hit with Skill Link") +TO_DO_BATTLE_TEST("Accuracy for Population Bomb is only checked for the first hit with Loaded Dice") diff --git a/test/move_effect_triple_kick.c b/test/move_effect_triple_kick.c index e0a91b011..4e47d6cc6 100644 --- a/test/move_effect_triple_kick.c +++ b/test/move_effect_triple_kick.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_TRIPLE_KICK].effect & EFFECT_TRIPLE_KICK); + ASSUME(gBattleMoves[MOVE_TRIPLE_KICK].effect == EFFECT_TRIPLE_KICK); } SINGLE_BATTLE_TEST("Triple Kick damage is increased by its base damage for each hit") @@ -29,3 +29,7 @@ SINGLE_BATTLE_TEST("Triple Kick damage is increased by its base damage for each EXPECT_MUL_EQ(firstHit, Q_4_12(3.0), thirdHit); } } + +TO_DO_BATTLE_TEST("Accuracy for Triple Kick is checked independently for each hit") +TO_DO_BATTLE_TEST("Accuracy for Triple Kick is only checked for the first hit with Skill Link") +TO_DO_BATTLE_TEST("Accuracy for Triple Kick is only checked for the first hit with Loaded Dice") diff --git a/test/move_flag_three_strikes.c b/test/move_flag_strike_count.c similarity index 76% rename from test/move_flag_three_strikes.c rename to test/move_flag_strike_count.c index 21debc730..0c71d6731 100644 --- a/test/move_flag_three_strikes.c +++ b/test/move_flag_strike_count.c @@ -1,7 +1,22 @@ #include "global.h" #include "test_battle.h" -SINGLE_BATTLE_TEST("Three-strike flag turns a move into a 3-hit move") +SINGLE_BATTLE_TEST("Two strike count turns a move into a 2-hit move") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_DOUBLE_KICK].strikeCount == 2); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DOUBLE_KICK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_KICK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_KICK, player); + MESSAGE("Hit 2 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Three strike count turns a move into a 3-hit move") { s16 firstHit; s16 secondHit; From 4a657c7eaff8ef277e00e6ddbbcfdc651befab52 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 25 Jul 2023 20:47:35 -0300 Subject: [PATCH 086/111] Revamped GetTotalAccuracy --- src/battle_script_commands.c | 74 +++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ccd4a404f..69d6eb1a4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1852,6 +1852,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u s8 buff, accStage, evasionStage; u8 atkParam = GetBattlerHoldEffectParam(battlerAtk); u8 defParam = GetBattlerHoldEffectParam(battlerDef); + u8 atkAlly = BATTLE_PARTNER(battlerAtk); + u16 atkAllyAbility = GetBattlerAbility(atkAlly); gPotentialItemEffectBattler = battlerDef; accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; @@ -1885,30 +1887,66 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u calc = gAccuracyStageRatios[buff].dividend * moveAcc; calc /= gAccuracyStageRatios[buff].divisor; - if (atkAbility == ABILITY_COMPOUND_EYES) + // Attacker's ability + switch (atkAbility) + { + case ABILITY_COMPOUND_EYES: calc = (calc * 130) / 100; // 1.3 compound eyes boost - else if (atkAbility == ABILITY_VICTORY_STAR) + break; + case ABILITY_VICTORY_STAR: calc = (calc * 110) / 100; // 1.1 victory star boost - if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) && GetBattlerAbility(BATTLE_PARTNER(battlerAtk)) == ABILITY_VICTORY_STAR) - calc = (calc * 110) / 100; // 1.1 ally's victory star boost + break; + case ABILITY_HUSTLE: + if (IS_MOVE_PHYSICAL(move)) + calc = (calc * 80) / 100; // 1.2 hustle loss + break; + } - if (defAbility == ABILITY_SAND_VEIL && WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SANDSTORM) - calc = (calc * 80) / 100; // 1.2 sand veil loss - else if (defAbility == ABILITY_SNOW_CLOAK && WEATHER_HAS_EFFECT && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) - calc = (calc * 80) / 100; // 1.2 snow cloak loss - else if (defAbility == ABILITY_TANGLED_FEET && gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - calc = (calc * 50) / 100; // 1.5 tangled feet loss + // Target's ability + switch (defAbility) + { + case ABILITY_SAND_VEIL: + if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SANDSTORM) + calc = (calc * 80) / 100; // 1.2 sand veil loss + break; + case ABILITY_SNOW_CLOAK: + if (WEATHER_HAS_EFFECT && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + calc = (calc * 80) / 100; // 1.2 snow cloak loss + break; + case ABILITY_TANGLED_FEET: + if (gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + calc = (calc * 50) / 100; // 1.5 tangled feet loss + break; + } - if (atkAbility == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move)) - calc = (calc * 80) / 100; // 1.2 hustle loss + // Attacker's ally's ability + switch (atkAllyAbility) + { + case ABILITY_VICTORY_STAR: + if (IsBattlerAlive(atkAlly)) + calc = (calc * 110) / 100; // 1.1 ally's victory star boost + break; + } - if (defHoldEffect == HOLD_EFFECT_EVASION_UP) + // Attacker's hold effect + switch (atkHoldEffect) + { + case HOLD_EFFECT_WIDE_LENS: + calc = (calc * (100 + atkParam)) / 100; + break; + case HOLD_EFFECT_ZOOM_LENS: + if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)) + calc = (calc * (100 + atkParam)) / 100; + break; + } + + // Target's hold effect + switch (defHoldEffect) + { + case HOLD_EFFECT_EVASION_UP: calc = (calc * (100 - defParam)) / 100; - - if (atkHoldEffect == HOLD_EFFECT_WIDE_LENS) - calc = (calc * (100 + atkParam)) / 100; - else if (atkHoldEffect == HOLD_EFFECT_ZOOM_LENS && GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)) - calc = (calc * (100 + atkParam)) / 100; + break; + } if (gProtectStructs[battlerAtk].usedMicleBerry) { From 5167b01b14db8a3062d2db35d5428600911f4800 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 29 Jul 2023 12:44:21 +0200 Subject: [PATCH 087/111] var for ability + hold effect, loaded dice comparison fix for small bug introduced in the latest commit --- src/battle_script_commands.c | 10 ++++++---- test/move_effect_population_bomb.c | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6a3ccde0c..2adfcdcc2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1708,6 +1708,8 @@ static void Cmd_accuracycheck(void) u16 type, move = cmd->move; u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); + u16 gBattlerAttackerAbility = GetBattlerAbility(gBattlerAttacker); + u8 gBattlerAttackerHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); if (move == ACC_CURR_MOVE) move = gCurrentMove; @@ -1723,7 +1725,7 @@ static void Cmd_accuracycheck(void) } else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT || (gSpecialStatuses[gBattlerAttacker].multiHitOn - && (GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK || GetBattlerHoldEffect(gBattlerAttacker, TRUE) + && (gBattlerAttackerAbility == ABILITY_SKILL_LINK || gBattlerAttackerHoldEffect == HOLD_EFFECT_LOADED_DICE || !(gBattleMoves[move].effect == EFFECT_TRIPLE_KICK || gBattleMoves[move].effect == EFFECT_POPULATION_BOMB)))) { // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel/Population Bomb @@ -1743,16 +1745,16 @@ static void Cmd_accuracycheck(void) gBattlerAttacker, gBattlerTarget, move, - GetBattlerAbility(gBattlerAttacker), + gBattlerAttackerAbility, GetBattlerAbility(gBattlerTarget), - GetBattlerHoldEffect(gBattlerAttacker, TRUE), + gBattlerAttackerHoldEffect, GetBattlerHoldEffect(gBattlerTarget, TRUE) ); if (!RandomPercentage(RNG_ACCURACY, accuracy)) { gMoveResultFlags |= MOVE_RESULT_MISSED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_BLUNDER_POLICY) + if (gBattlerAttackerHoldEffect == HOLD_EFFECT_BLUNDER_POLICY) gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && diff --git a/test/move_effect_population_bomb.c b/test/move_effect_population_bomb.c index 439cbe809..1305f456c 100644 --- a/test/move_effect_population_bomb.c +++ b/test/move_effect_population_bomb.c @@ -1,6 +1,29 @@ #include "global.h" #include "test_battle.h" +SINGLE_BATTLE_TEST("Population Bomb can hit ten times") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_POPULATION_BOMB].strikeCount == 10); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POPULATION_BOMB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player); + MESSAGE("Hit 10 time(s)!"); + } +} + TO_DO_BATTLE_TEST("Accuracy for Population Bomb is checked independently for each hit") TO_DO_BATTLE_TEST("Accuracy for Population Bomb is only checked for the first hit with Skill Link") TO_DO_BATTLE_TEST("Accuracy for Population Bomb is only checked for the first hit with Loaded Dice") From c76e5deb9f9021bc41dfee4247bd9856c783529e Mon Sep 17 00:00:00 2001 From: Eclipse <115349505+SubzeroEclipse@users.noreply.github.com> Date: Sun, 30 Jul 2023 16:08:56 +0200 Subject: [PATCH 088/111] Fixed Wailord icon (#3183) --- graphics/pokemon/wailord/icon.png | Bin 402 -> 363 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/wailord/icon.png b/graphics/pokemon/wailord/icon.png index 948e312f62d41307f1fdaffd2d08db703de4267c..0d82ae1ade084257db204e86c34394fb1e1ffa8a 100644 GIT binary patch delta 276 zcmV+v0qg#f1M32iV1M>WL_t(I%hi%Q4#F@DhI@lZvgAA@_-2@5^E(2*c zQby0>CBt7GotQB$eYI#Z6br`HPT1PWG8msr;c~Yjc|>bxLw}>KDXc#)TUA2n$+|Zq zZ)I0Pk0yv;XFu%I2!u`p#^Bb2=+Oum<2KB`9tf?CAD4q3xNd5!^6fUbE!JBBsOq20 zv|Dzp1(ZCXu*8T%AI=|fkUJcFz(+XjukQfKaaf>?@Yhc`xW;oF+-M00fBl4mAN?CR ayaAWQ=PWOu^9{=Y0000O{4>%h`q<*OY z008w#L_t(I%hi%Q4#OY}hI0d?^aP;?hy-hI*9D}gNS%_U941SS(kY?oLMIo(J8RV; z7K?w``1MuQ0S$qDxxhe+B1AK$%A8)NbTHXykipfgn?Rw#Wq%;eM#|__d}R2mqZ2d6 zrLPuEhGN0E+6h}5Sq9^CDcqhmB#&tAY-qGKh4trUt4avHSodM%t?WwZ*#zK+{4|8a{`wA(9ESzU2!H*AgKIp;!Ht%1@Yhc`_|gA>!xudW=PUvqkxu{s N002ovPDHLkV1j#qjPw8i From 5eec3b2fc3e863326e5bb0f6a1828528c15d7c29 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 30 Jul 2023 16:50:51 +0200 Subject: [PATCH 089/111] fix various issues with primal weather blocking water/fire type moves (#3138) * fix various issues with primal weather blocking water/fire type moves * forgot to change return to effect=1 * fix bugs --- data/battle_scripts_1.s | 20 +--- include/battle_scripts.h | 3 +- include/battle_util.h | 2 +- include/constants/battle_string_ids.h | 4 + src/battle_message.c | 6 ++ src/battle_script_commands.c | 37 ++++---- src/battle_util.c | 7 +- test/primal_weather.c | 127 ++++++++++++++++++++++++++ 8 files changed, 164 insertions(+), 42 deletions(-) create mode 100644 test/primal_weather.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 39712db73..372e0e8e6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8782,15 +8782,14 @@ BattleScript_DesolateLandActivates:: call BattleScript_ActivateWeatherAbilities end3 -BattleScript_DesolateLandEvaporatesWaterTypeMoves:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE +BattleScript_PrimalWeatherBlocksMove:: + jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_ATTACKSTRING_PRINTED, BattleScript_MoveEnd @in case of multi-target moves, if move fails once, no point in printing the message twice + accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON attackstring pause B_WAIT_TIME_SHORT ppreduce - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd - printstring STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT + printfromtable gPrimalWeatherBlocksStringIds waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_STRING_PRINTED goto BattleScript_MoveEnd BattleScript_PrimordialSeaActivates:: @@ -8802,17 +8801,6 @@ BattleScript_PrimordialSeaActivates:: call BattleScript_ActivateWeatherAbilities end3 -BattleScript_PrimordialSeaFizzlesOutFireTypeMoves:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - pause B_WAIT_TIME_SHORT - ppreduce - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd - printstring STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN - waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_STRING_PRINTED - goto BattleScript_MoveEnd - BattleScript_DeltaStreamActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b20ac35dd..95f068cf5 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -409,9 +409,8 @@ extern const u8 BattleScript_GulpMissileGorging[]; extern const u8 BattleScript_GulpMissileGulping[]; extern const u8 BattleScript_BattleBondActivatesOnMoveEndAttacker[]; extern const u8 BattleScript_DesolateLandActivates[]; -extern const u8 BattleScript_DesolateLandEvaporatesWaterTypeMoves[]; extern const u8 BattleScript_PrimordialSeaActivates[]; -extern const u8 BattleScript_PrimordialSeaFizzlesOutFireTypeMoves[]; +extern const u8 BattleScript_PrimalWeatherBlocksMove[]; extern const u8 BattleScript_DeltaStreamActivates[]; extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; diff --git a/include/battle_util.h b/include/battle_util.h index 15fbe2432..51375000c 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -136,8 +136,8 @@ u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); +u8 AtkCanceller_UnableToUseMove(u32 moveType); void SetAtkCancellerForCalledMove(void); -u8 AtkCanceller_UnableToUseMove(void); u8 AtkCanceller_UnableToUseMove2(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility); diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 174c611e2..0597612d1 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -827,6 +827,10 @@ #define B_MSG_SOMEONES_BOX_FULL 2 #define B_MSG_LANETTES_BOX_FULL 3 +// gPrimalWeatherBlocksStringIds +#define B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN 0 +#define B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN 1 + // gInobedientStringIds #define B_MSG_LOAFING 0 #define B_MSG_WONT_OBEY 1 diff --git a/src/battle_message.c b/src/battle_message.c index 1585f8c47..0613906c3 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1850,6 +1850,12 @@ const u16 gWeatherStartsStringIds[] = [WEATHER_ABNORMAL] = STRINGID_ITISRAINING }; +const u16 gPrimalWeatherBlocksStringIds[] = +{ + [B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN] = STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN, + [B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN] = STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT, +}; + const u16 gInobedientStringIds[] = { [B_MSG_LOAFING] = STRINGID_PKMNLOAFING, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ccd4a404f..cf793bf24 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1503,25 +1503,8 @@ static void Cmd_attackcanceler(void) s32 i, moveType; u16 attackerAbility = GetBattlerAbility(gBattlerAttacker); - GET_MOVE_TYPE(gCurrentMove, moveType); - if (WEATHER_HAS_EFFECT && gBattleMoves[gCurrentMove].power) - { - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL)) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_PrimordialSeaFizzlesOutFireTypeMoves; - return; - } - else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DesolateLandEvaporatesWaterTypeMoves; - return; - } - } - if (gBattleOutcome != 0) { gCurrentActionFuncId = B_ACTION_FINISHED; @@ -1537,9 +1520,27 @@ static void Cmd_attackcanceler(void) if (TryAegiFormChange()) return; #endif - if (AtkCanceller_UnableToUseMove()) + if (AtkCanceller_UnableToUseMove(moveType)) return; + if (WEATHER_HAS_EFFECT && gBattleMoves[gCurrentMove].power) + { + if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; + return; + } + else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; + return; + } + } + if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF && GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) diff --git a/src/battle_util.c b/src/battle_util.c index d549b71b9..168d5432d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3389,10 +3389,9 @@ void SetAtkCancellerForCalledMove(void) gBattleStruct->isAtkCancelerForCalledMove = TRUE; } -u8 AtkCanceller_UnableToUseMove(void) +u8 AtkCanceller_UnableToUseMove(u32 moveType) { u8 effect = 0; - s32 *bideDmg = &gBattleScripting.bideDmg; do { switch (gBattleStruct->atkCancellerTracker) @@ -3653,7 +3652,7 @@ u8 AtkCanceller_UnableToUseMove(void) if (gTakenDmg[gBattlerAttacker]) { gCurrentMove = MOVE_BIDE; - *bideDmg = gTakenDmg[gBattlerAttacker] * 2; + gBattleScripting.bideDmg = gTakenDmg[gBattlerAttacker] * 2; gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker]; if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); @@ -3723,8 +3722,6 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_POWDER_STATUS: if (gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER) { - u32 moveType; - GET_MOVE_TYPE(gCurrentMove, moveType); if (moveType == TYPE_FIRE) { gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; diff --git a/test/primal_weather.c b/test/primal_weather.c new file mode 100644 index 000000000..650a79921 --- /dev/null +++ b/test/primal_weather.c @@ -0,0 +1,127 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_EMBER].power != 0); + ASSUME(gBattleMoves[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(gBattleMoves[MOVE_WATER_GUN].power != 0); + ASSUME(gBattleMoves[MOVE_WATER_GUN].type == TYPE_WATER); +} + +SINGLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves") +{ + GIVEN { + PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB);} + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + MESSAGE("Foe Wobbuffet used Ember!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + MESSAGE("The Fire-type attack fizzled out\nin the heavy rain!"); + NOT HP_BAR(player); + MESSAGE("Foe Wobbuffet used Ember!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + MESSAGE("The Fire-type attack fizzled out\nin the heavy rain!"); + NOT HP_BAR(player); + } THEN { + EXPECT_EQ(player->hp, player->maxHP); + } +} + +DOUBLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves and prints the message only once with moves hitting multiple targets") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_ERUPTION].power != 0); + ASSUME(gBattleMoves[MOVE_ERUPTION].type == TYPE_FIRE); + ASSUME(gBattleMoves[MOVE_ERUPTION].target == MOVE_TARGET_BOTH); + PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB); {Speed(5);}} + PLAYER(SPECIES_WOBBUFFET) {Speed(5);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(10);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(8);} + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ERUPTION); } + } SCENE { + MESSAGE("Foe Wobbuffet used Eruption!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ERUPTION, opponentLeft); + MESSAGE("The Fire-type attack fizzled out\nin the heavy rain!"); + NOT MESSAGE("The Fire-type attack fizzled out\nin the heavy rain!"); + } THEN { + EXPECT_EQ(playerLeft->hp, playerLeft->maxHP); + EXPECT_EQ(playerRight->hp, playerRight->maxHP); + } +} + +SINGLE_BATTLE_TEST("Primordial Sea does not block a move if pokemon is asleep and uses a Fire-type move") // Sleep/confusion/paralysis all happen before the check for primal weather +{ + GIVEN { + PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB);} + OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + NOT MESSAGE("The Fire-type attack fizzled out\nin the heavy rain!"); + MESSAGE("Foe Wobbuffet is fast asleep."); + } +} + +SINGLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves") +{ + GIVEN { + PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB);} + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + MESSAGE("Foe Wobbuffet used Water Gun!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + MESSAGE("The Water-type attack evaporated in the harsh sunlight!"); + NOT HP_BAR(player); + MESSAGE("Foe Wobbuffet used Water Gun!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + MESSAGE("The Water-type attack evaporated in the harsh sunlight!"); + NOT HP_BAR(player); + } THEN { + EXPECT_EQ(player->hp, player->maxHP); + } +} + +DOUBLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves and prints the message only once with moves hitting multiple targets") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_SURF].power != 0); + ASSUME(gBattleMoves[MOVE_SURF].type == TYPE_WATER); + ASSUME(gBattleMoves[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB); {Speed(5);}} + PLAYER(SPECIES_WOBBUFFET) {Speed(5);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(10);} + OPPONENT(SPECIES_WOBBUFFET) {Speed(8);} + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SURF); } + } SCENE { + MESSAGE("Foe Wobbuffet used Surf!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); + MESSAGE("The Water-type attack evaporated in the harsh sunlight!"); + NOT MESSAGE("The Water-type attack evaporated in the harsh sunlight!"); + } THEN { + EXPECT_EQ(playerLeft->hp, playerLeft->maxHP); + EXPECT_EQ(playerRight->hp, playerRight->maxHP); + EXPECT_EQ(opponentRight->hp, opponentRight->maxHP); + } +} + +SINGLE_BATTLE_TEST("Desolate Land does not block a move if pokemon is asleep and uses a Water-type move") // Sleep/confusion/paralysis all happen before the check for primal weather +{ + GIVEN { + PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB);} + OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + NOT MESSAGE("The Water-type attack evaporated in the harsh sunlight!"); + MESSAGE("Foe Wobbuffet is fast asleep."); + } +} From efb98e97c76d453f3ecd7cd773696b18c325632a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 31 Jul 2023 14:22:48 +0200 Subject: [PATCH 090/111] remove unused config B_CHECK_IF_CHARGED_UP --- include/config/battle.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/config/battle.h b/include/config/battle.h index 20cb7eb81..10d2648a8 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -118,7 +118,6 @@ #define B_PLUS_MINUS_INTERACTION GEN_LATEST // In Gen5+, Plus and Minus can be activated with themselves and the opposite ability. Before, only the opposing ability could activate it. #define B_WEATHER_FORMS GEN_LATEST // In Gen5+, Castform and Cherrim revert to their base form upon losing their respective ability. Cherrim needs Flower Gift to swap forms. #define B_SYMBIOSIS_GEMS GEN_LATEST // In Gen7+, Symbiosis passes an item after a gem-boosted attack. Previously, items are passed before the gem-boosted attack hits, making the item effect apply. -#define B_CHECK_IF_CHARGED_UP TRUE // If set to TRUE, certain abilities such as Electromorphosis WILL check if the STATUS3_CHARGED_UP status flag is applied. #define B_ABSORBING_ABILITY_STRING GEN_LATEST // In Gen5+, the abilities that absorb moves of a certain type use a generic string for stat increases and decreases. #define B_LEAF_GUARD_PREVENTS_REST GEN_LATEST // In Gen5+, Leaf Guard prevents the use of Rest in harsh sunlight. #define B_SNOW_WARNING GEN_LATEST // In Gen9+, Snow Warning will summon snow instead of hail. From f0d03dd99b95f9fcc186750d30e103e28d2125a3 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 31 Jul 2023 09:41:53 -0400 Subject: [PATCH 091/111] Set GEN_LATEST to GEN_9 (#3186) --- include/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/config.h b/include/config.h index 2ad84f29c..5115a9936 100644 --- a/include/config.h +++ b/include/config.h @@ -71,7 +71,7 @@ #define GEN_7 4 #define GEN_8 5 #define GEN_9 6 -#define GEN_LATEST GEN_8 +#define GEN_LATEST GEN_9 // General settings #define EXPANSION_INTRO TRUE // If TRUE, a custom RHH intro will play after the vanilla copyright screen. From 15c0ea253a5b81dc2ac4446bef44f7e6023ff804 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 31 Jul 2023 17:17:50 -0400 Subject: [PATCH 092/111] Animation script cleanup and fixes - Part 1 (#3185) * Cleaned: visible, monbg & invisible * Cleaned: createvisualtaskontargets AnimTask_ShakeMon * Cleaned: createvisualtask SoundTask_PlayDoubleCry * Fixed: createvisualtask SoundTask_PlayCryWithEcho Checksum changed from 7a05d0b5b2cd65346597a9a598c7f7cde1570475 to 35eae7f4357391b1ce38f0d79715f47f92c82087 * Cleaned: createvisualtask SoundTask_PlayCryHighPitch * Cleaned: createvisualtask AnimTask_WindUpLunge * Cleaned: createvisualtask AnimTask_TranslateMonEllipticalRespectSide * Cleaned: createvisualtask AnimTask_SwayMon * Cleaned: createvisualtask AnimTask_Splash * Removed bad use of: createvisualtask AnimTask_Splash in Move_ROCK_CLIMB It wasn't breaking the animation because ANIM_ATTACKER (0) was being passed for the hop count, essentially skipping the animation. * Cleaned: createvisualtask AnimTask_ShockWaveProgressingBolt & AnimTask_ShakeMonInPlace * Fixed Move_PLASMA_FISTS's use of AnimTask_ShockWaveProgressingBolt --- data/battle_anim_scripts.s | 163 ++++++++++++++++++------------------- 1 file changed, 81 insertions(+), 82 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7c995ef72..f41f541a1 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1750,7 +1750,7 @@ Move_LAST_RESORT: delay 10 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, 0, 18, 6, 2, 4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 0, 16, 16, RGB(31, 31, 31) createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 0, 20, 0, 0, 4 @@ -1881,7 +1881,7 @@ Move_MAGNET_RISE: delay 0 createvisualtask AnimTask_BlendColorCycle 2, 31, -31, 1, 5, 5, RGB(31, 31, 20) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createvisualtask AnimTask_WindUpLunge, 5, 7, 0, -12, 4, 10, 10, 12, 6 + createvisualtask AnimTask_WindUpLunge, 5, ANIM_OPPONENT_RIGHT, 0, -12, 4, 10, 10, 12, 6 createsprite gSparkElectricitySpriteTemplate, 0, 7, 32, 24, 190, 12, 0, 1, 0 delay 0 createsprite gSparkElectricitySpriteTemplate, 0, 7, 80, 24, 22, 12, 0, 1, 0 @@ -2121,7 +2121,7 @@ Move_POISON_JAB: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, -6, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 2, 31, 10 - createvisualtask AnimTask_SwayMon, 5, 0, 3, 0x2000, 6, ANIM_TARGET + createvisualtask AnimTask_SwayMon, 5, 0, 3, 8192, 6, ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB(16, 0, 16), 12, 0, 1 delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 6, 4, 1, 3 @@ -2651,7 +2651,7 @@ GigaImpactContinuity: delay 1 createsprite gSlideMonToOffsetSpriteTemplate 2, 5, 1, -16, 0, 0, 4 waitforvisualfinish - createvisualtask AnimTask_ShakeMonInPlace 2, 5, 1, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 4, 0, 12, 1 waitforvisualfinish delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate 2, 3, 0, 0, 5 @@ -2957,7 +2957,7 @@ Move_SHADOW_SNEAK: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x0000 waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x12, 0x6, 0x1, 0x3 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 createvisualtask AnimTask_AttackerFadeToInvisible, 0x2, 0x1 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -3168,7 +3168,6 @@ Move_FLASH_CANNON: end Move_ROCK_CLIMB: - createvisualtask AnimTask_Splash, 2, 2, ANIM_ATTACKER, 3 delay 8 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 3 waitforvisualfinish @@ -3828,19 +3827,19 @@ Move_CHATTER: monbg ANIM_DEF_PARTNER createvisualtask AnimTask_UproarDistortion, 2, 0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 - createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x1d, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, 0xffe3, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 - createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, 0xffe3, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe3, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 - createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x18, 0xffe8, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe8, 0xffe8, 0 waitforvisualfinish @@ -4105,7 +4104,7 @@ Move_AQUA_JET: delay 12 call RisingWaterHitEffect waitforvisualfinish - visible 0 + visible ANIM_ATTACKER clearmonbg ANIM_DEF_PARTNER blendoff end @@ -4290,7 +4289,7 @@ Move_ROAR_OF_TIME: createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 16, 0, 0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, -1 - createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL delay 0x20 createvisualtask AnimTask_ShakeMonInPlace, 2, 1, 10, 0, 20, 1 playsewithpan 170, SOUND_PAN_TARGET @@ -4636,7 +4635,7 @@ ShadowForcePrep: createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_DEF_PARTNER, TRUE waitforvisualfinish clearmonbg ANIM_ATTACKER - invisible 0 + invisible ANIM_ATTACKER delay 1 goto ShadowForceWaitEnd ShadowForceAttack: @@ -4841,7 +4840,7 @@ Move_AUTOTOMIZE: loadspritegfx ANIM_TAG_METAL_BITS @Metal Bits setalpha 12, 8 monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x18, 0x6, 0x4, 0x4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 4, 4 createvisualtask AnimTask_TraceMonBlended 0x2, 0x0, 0x4, 0x7, 0xa playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x0 @@ -4894,7 +4893,7 @@ Move_TELEKINESIS:: createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 0xd, 0x14, 0xffec waitforvisualfinish loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x3 - createvisualtask AnimTask_SwayMon, 0x5, 0x1, 0x18, 0xD0, 0x1, ANIM_TARGET + createvisualtask AnimTask_SwayMon, 5, 1, 24, 208, 1, ANIM_TARGET waitforvisualfinish delay 0xA createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x9, 0x0, 0x0 @@ -5147,7 +5146,7 @@ Move_FLAME_CHARGE: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x20, 0x6 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0xc, 0x6, 0x6, 0x3 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 call FlameChargeSwirl delay 0x9 call FlameChargeSwirl @@ -5268,7 +5267,7 @@ Move_SIMPLE_BEAM: call SimpleBeamsRegular call SimpleBeamsRegular createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7FFF - createvisualtask AnimTask_SwayMon, 0x5, 0x0, 0x6, 0x800, 0x4, ANIM_TARGET + createvisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 4, ANIM_TARGET call SimpleBeamWithRings call SimpleBeamWithRings call SimpleBeamWithRings @@ -5319,7 +5318,7 @@ Move_ENTRAINMENT: Move_AFTER_YOU: loadspritegfx ANIM_TAG_ANGER @rage loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @green color - createvisualtask AnimTask_SwayMon, 0x5, 0x1, 0xF, 0x600, 0x2, ANIM_ATTACKER + createvisualtask AnimTask_SwayMon, 5, 1, 15, 1536, 2, ANIM_ATTACKER delay 0x1 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0xffe0 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xffe5 @@ -5336,7 +5335,7 @@ Move_ROUND: createvisualtask AnimTask_MusicNotesRainbowBlend, 2 waitforvisualfinish monbg ANIM_TARGET - createvisualtask SoundTask_PlayCryHighPitch, 2, 0, 255 + createvisualtask SoundTask_PlayCryHighPitch, 2, ANIM_ATTACKER, 255 createvisualtask AnimTask_UproarDistortion, 2, 0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 0, 12 delay 5 @@ -5379,7 +5378,7 @@ Move_CHIP_AWAY: waitforvisualfinish monbg ANIM_ATK_PARTNER setalpha 12, 8 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x18, 0x6, 0x1, 0x5 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 delay 0x4 createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x5, 0x0, 0x6, 0x1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x1, 0x1 @@ -5658,7 +5657,7 @@ Move_CIRCLE_THROW: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0xc, 0x4, 0x1, 0x2 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 2 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x14, 0x0, 0x0, 0x4 delay 0x2 @@ -5686,8 +5685,8 @@ Move_INCINERATE: delay 1 createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtask AnimTask_SwayMon, 5, 0, 3, 0xc00, 8, ANIM_TARGET - createvisualtask AnimTask_SwayMon, 5, 0, 3, 0xc00, 8, ANIM_DEF_PARTNER + createvisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_TARGET + createvisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_DEF_PARTNER delay 3 createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 delay 3 @@ -6256,7 +6255,7 @@ VoltSwitchLast: @ Attacking the same side requires a change of direction @ why would you attack your partner though?! VoltSwitchAgainstPartner: - createvisualtask AnimTask_SlideOffScreen, 5, ANIM_ATTACKER, +2 + createvisualtask AnimTask_SlideOffScreen, 5, ANIM_ATTACKER, 2 goto VoltSwitchContinue Move_STRUGGLE_BUG: @@ -6286,7 +6285,7 @@ Move_STRUGGLE_BUG: end Move_BULLDOZE: - createvisualtask AnimTask_Splash, 0x2, 0x0, 0x3 + createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 delay 0x8 goto Move_EARTHQUAKE @@ -7422,7 +7421,7 @@ Move_RELIC_SONG: monbg ANIM_DEF_PARTNER createvisualtask AnimTask_MusicNotesRainbowBlend, 0x2 waitforvisualfinish - createvisualtask SoundTask_PlayCryWithEcho, 2, ANIM_ATTACKER, 2 + createvisualtask SoundTask_PlayCryWithEcho, 2, FALSE createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 @@ -7572,7 +7571,7 @@ Move_BOLT_STRIKE:: clearmonbg ANIM_ATTACKER playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 0x8 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x12, 0x6, 0x2, 0x4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 delay 0xA fadetobg BG_BOLT_STRIKE waitbgfadeout @@ -7928,7 +7927,7 @@ Move_V_CREATE:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0xA00, 0x0, 0x1, 0xffff waitbgfadein playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER - createvisualtask AnimTask_WindUpLunge, 0x5, 0x0, 0xffe8, 0x8, 0x17, 0xa, 0x28, 0xa + createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 delay 0x23 createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x5, 0x32, 0x1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x1f @@ -8177,10 +8176,10 @@ Move_ROTOTILLER:: waitforvisualfinish createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x0, 0xb4 createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x1, 0xb4 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x6, 0x4, 0x2, 0x4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 6, 4, 2, 4 call DigThrowDirt call DigThrowDirt - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x6, 0x4, 0x2, 0x4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 6, 4, 2, 4 call DigThrowDirt call DigThrowDirt waitforvisualfinish @@ -8465,7 +8464,7 @@ Move_DISARMING_VOICE:: loadspritegfx ANIM_TAG_NOISE_LINE createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d waitforvisualfinish - createvisualtask SoundTask_PlayDoubleCry, 0x2, 0x0, 0xff + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect delay 0xA createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x1, 0x0, 0x1A, 0x1 @@ -8482,7 +8481,7 @@ Move_PARTING_SHOT: fadetobg BG_DARK waitbgfadein delay 0 - createvisualtask SoundTask_PlayDoubleCry, 2, 0, 255 + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 @@ -8769,7 +8768,7 @@ Move_PLAY_ROUGH:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_PINK_HEART loadspritegfx ANIM_TAG_DUCK - monbg 0x3 + monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0xa @@ -8875,7 +8874,7 @@ Move_BOOMBURST: loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_THIN_RING createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x4 | 0x8 | 0x10 - createvisualtask SoundTask_PlayCryWithEcho, 5 + createvisualtask SoundTask_PlayCryWithEcho, 5, FALSE createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 5, ANIM_ATTACKER, 0 createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 45, 0, 0, 0, 0, 0, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 @@ -8952,14 +8951,14 @@ Move_KINGS_SHIELD:: Move_PLAY_NICE:: loadspritegfx ANIM_TAG_RED_HEART loopsewithpan SE_M_SANDSTORM, SOUND_PAN_ATTACKER, 0xc, 0x3 - createvisualtask AnimTask_SwayMon, 0x5, 0x0, 0xc, 0x1000, 0x4, 0x0 + createvisualtask AnimTask_SwayMon, 5, 0, 12, 4096, 4, ANIM_ATTACKER delay 0xF createsprite gRedHeartProjectileSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff8 end Move_CONFIDE:: loadspritegfx ANIM_TAG_CONFIDE @Confide Bubble - createvisualtask AnimTask_Splash, 0x2, ANIM_ATTACKER, 0x3 + createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 createsprite gConfideBubbleTemplate, ANIM_ATTACKER, 11, 0x0, 0x64 playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9617,7 +9616,7 @@ Move_HOLD_HANDS:: loadspritegfx ANIM_TAG_MAGENTA_HEART @charm loadspritegfx ANIM_TAG_VERTICAL_HEX @red playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0xc, 0x6, 0x6, 0x3 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c delay 0x8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c @@ -10362,7 +10361,7 @@ Move_HYPERSPACE_FURY:: createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0x10, 0x10 call HyperspaceFuryRandomImpact delay 0x7 - createvisualtask SoundTask_PlayDoubleCry, 0x2, ANIM_ATTACKER, 0xff + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL visible ANIM_ATTACKER createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x0, 0x3, 0x20, 0x1 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET @@ -10862,7 +10861,7 @@ SolarBladeUnleash: createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS), 1, 0, 6, 0x7fff waitforvisualfinish playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x10, 0x6, 0x1, 0x4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 16, 6, 1, 4 createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 call SolarBladeSunRays call SolarBladeSunRays @@ -12125,40 +12124,40 @@ ShellTrapUnleash: delay 0x3 call ShellTrapFireLaunch2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 delay 0x3 waitforvisualfinish clearmonbg ANIM_TARGET @@ -12181,31 +12180,31 @@ ShellTrapFireLaunch1: return ShellTrapFireLaunch2: createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x38, 0x4, 0x4, 0x1 - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 0x3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x38, 0x4, 0x4, 0x1 - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 0x3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x38, 0xfffc, 0x3, 0x1 - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 0x3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0xfffc, 0x5, 0x1 - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 0x3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xf, 0x0, 0xf, 0x38, 0x4, 0x4, 0x1 - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 0x3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0x4, 0x4, 0x1 - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 0x3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x14, 0x0, 0x14, 0x38, 0x4, 0x4, 0x1 - createvisualtaskontargets AnimTask_ShakeMon, 0x2, 0, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 0x3 return @@ -12324,7 +12323,7 @@ Move_STOMPING_TANTRUM:: loadspritegfx ANIM_TAG_IMPACT @pound hit loadspritegfx ANIM_TAG_SMALL_EMBER @hit color monbg ANIM_TARGET - createvisualtask AnimTask_Splash, 0x2, ANIM_ATTACKER, 0x3 + createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 delay 0x5 createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x5 createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x5 @@ -12386,7 +12385,7 @@ Move_ACCELEROCK:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_ATK_PARTNER setalpha 12, 8 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x18, 0x6, 0x1, 0x5 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 createvisualtask AnimTask_TraceMonBlended, 0x2, 0x0, 0x4, 0x7, 0x3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 0x4 @@ -12559,7 +12558,7 @@ SpectralThiefUnleash: delay 0x5 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x0, 0x0 - invisible 0x0 + invisible ANIM_ATTACKER delay 0x2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x0, 0x0 delay 0x2 @@ -12625,7 +12624,7 @@ SpectralThiefUnleash: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 waitforvisualfinish - visible 0x0 + visible ANIM_ATTACKER delay 0x2 restorebg waitbgfadein @@ -12856,10 +12855,10 @@ Move_ZING_ZAP:: call ZingZapSparks2 createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x4, 0x0, 0x6, 0x1 delay 0xA - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x18, 0x6, 0x1, 0x5 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 delay 0x4 call ZingZapSparks1 - invisible 0x0 + invisible ANIM_ATTACKER createsprite gZingZapYellowBallTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xF delay 0xA call ZingZapSparks2 @@ -12870,7 +12869,7 @@ Move_ZING_ZAP:: createsprite gZingZapRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x6, 0x1 call ElectricityEffect - visible 0x0 + visible ANIM_ATTACKER waitforvisualfinish clearmonbg ANIM_TARGET end @@ -13102,7 +13101,7 @@ Move_PLASMA_FISTS:: call PlasmaFistSpark2 waitforvisualfinish clearmonbg ANIM_ATTACKER - createvisualtask AnimTask_ShockWaveProgressingBolt, 0x5 + createvisualtask AnimTask_ShockWaveProgressingBolt, 5, ANIM_ATTACKER waitforvisualfinish monbg ANIM_TARGET call PlasmaFistsImpact @@ -13989,7 +13988,7 @@ Move_SPIRIT_BREAK:: createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_TEAL_ALERT, 0x0, 0xA, 0xA, 0x7DDE createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xA, 0xA, 0x7DDE monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_WindUpLunge, 0x5, ANIM_ATTACKER, 0xffec, 0x8, 0x30, 0x8, 0x38, 0x6 + createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 48, 8, 56, 6 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_TARGET call MindReaderEyeSpikeEffect @@ -14072,7 +14071,7 @@ Move_OBSTRUCT:: loadspritegfx ANIM_TAG_OBSTRUCT_CROSS createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_NOISE_LINE, 0, 10, 10, 0 @Black createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 10, 10, 0 @Black - createvisualtask SoundTask_PlayDoubleCry, 0x2, ANIM_ATTACKER, 0xff + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect waitforvisualfinish delay 0x10 @@ -14096,7 +14095,7 @@ Move_FALSE_SURRENDER:: waitbgfadein delay 0x0 playsewithpan SE_M_FAINT_ATTACK, 0xc0 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x12, 0x6, 0x1, 0x3 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 createvisualtask AnimTask_AttackerFadeToInvisible, 0x2, 0x1 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -14885,11 +14884,11 @@ Move_CORROSIVE_GAS:: @Credits to Skeli Move_COACHING:: playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER - createvisualtask AnimTask_Splash, 0x2, ANIM_ATTACKER, 0x1 + createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 1 waitforvisualfinish playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x1, 0x2, 0x0, 0xA, 0x1E5D - createvisualtask AnimTask_Splash, 0x2, ANIM_TARGET, 0x1 + createvisualtask AnimTask_Splash, 2, ANIM_TARGET, 1 waitforvisualfinish end @@ -15554,7 +15553,7 @@ Move_PSYSHIELD_BASH:: setalpha 12, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xB, 0x7FAF @;Light blue - createvisualtask AnimTask_WindUpLunge, 0x5, 0x0, 0xffe8, 0x8, 0x17, 0xa, 0x38, 0xa + createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 56, 10 delay 0x23 createsprite gSpriteTemplate_PsyshieldBashHit, ANIM_ATTACKER, 4, -10, 0x0, 0x1, 0x0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET @@ -15718,7 +15717,7 @@ Move_RAGING_FURY:: loadspritegfx ANIM_TAG_SMALL_EMBER loopsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER, 0x8, 0x3 createvisualtask AnimTask_BlendColorCycle, 0x2, (F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET), 0x2, 0x5, 0x3, 0x8, 0x1f - createvisualtask AnimTask_WindUpLunge, 0x5, ANIM_ATTACKER, 0xffec, 0x8, 0x20, 0x8, 0x38, 0x6 + createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 32, 8, 56, 6 call OutrageFlames call OutrageFlames delay 10 @@ -15737,7 +15736,7 @@ Move_WAVE_CRASH:: loadspritegfx ANIM_TAG_ICE_CRYSTALS @Bubbles on attacker monbg ANIM_DEF_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xB, 0x726A - createvisualtask AnimTask_WindUpLunge, 0x5, ANIM_ATTACKER, 0xffec, 0x8, 0x30, 0x8, 0x38, 0x6 + createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 48, 8, 56, 6 call WaterfallBubblesOnAttacker waitforvisualfinish createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x5, 0x5, 0x1 @@ -15848,7 +15847,7 @@ MountainGaleIceRock: @Credits to Skeli Move_VICTORY_DANCE:: loadspritegfx ANIM_TAG_HOLLOW_ORB - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, ANIM_ATTACKER, 0x28, 0x6, 0x3, 0x3 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 40, 6, 3, 3 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 0x8 createvisualtask AnimTask_BlendPalInAndOutByTag, 0x5, ANIM_TAG_HOLLOW_ORB, 0x0B1D, 0xe, 0x0, 0x3 @;Light orange @@ -19003,7 +19002,7 @@ Move_FLASH: end Move_SPLASH: - createvisualtask AnimTask_Splash, 2, 0, 3 + createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 delay 8 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 3 waitforvisualfinish @@ -19082,7 +19081,7 @@ Move_SKETCH: createsprite gPencilSpriteTemplate, ANIM_TARGET, 2 waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_Splash, 2, 0, 2 + createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 2 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 2 end @@ -20021,7 +20020,7 @@ Move_TEETER_DANCE: Move_MUD_SPORT: loadspritegfx ANIM_TAG_MUD_SAND - createvisualtask AnimTask_Splash, 2, 0, 6 + createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 6 delay 24 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, -4, -16 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, 4, -12 @@ -26794,7 +26793,7 @@ General_FormChange: end General_SlideOffScreen: - createvisualtask AnimTask_SlideOffScreen, 5, ANIM_TARGET, +3 + createvisualtask AnimTask_SlideOffScreen, 5, ANIM_TARGET, 3 waitforvisualfinish createvisualtask AnimTask_SetInvisible, 1, ANIM_TARGET, TRUE waitforvisualfinish @@ -27153,7 +27152,7 @@ Move_BREAKNECK_BLITZ:: waitbgfadein setalpha 12, 8 delay 0x10 - createvisualtask AnimTask_WindUpLunge, 0x5, 0x0, 0xffe8, 0x8, 0x17, 0xa, 0x28, 0xa + createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 delay 0x23 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @@ -27264,7 +27263,7 @@ Move_ALL_OUT_PUMMELING: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 0x10 - createvisualtask AnimTask_WindUpLunge, 0x5, 0x0, 0xffe8, 0x8, 0x17, 0xa, 0x28, 0xa + createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 delay 0x23 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @@ -29469,10 +29468,10 @@ TwinkleTackleFinish: delay 0x5 visible ANIM_ATTACKER visible ANIM_TARGET - createvisualtask AnimTask_SwayMon, 0x5, 0x0, 0x8, 2048, 1, ANIM_ATTACKER + createvisualtask AnimTask_SwayMon, 5, 0, 8, 2048, 1, ANIM_ATTACKER call TwinkleTackleStars waitforvisualfinish - createvisualtask AnimTask_SwayMon, 0x5, 0x0, 0x8, 2048, 1, ANIM_ATTACKER + createvisualtask AnimTask_SwayMon, 5, 0, 8, 2048, 1, ANIM_ATTACKER call TwinkleTackleStars waitforvisualfinish loadspritegfx ANIM_TAG_SPARKLE_4 @detect From d3f170ef0f70eaa41be139e460dc7bff65ecb51f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 30 Jul 2023 22:41:27 -0400 Subject: [PATCH 093/111] Cleaned: createvisualtask AnimTask_ShakeMonInPlace --- data/battle_anim_scripts.s | 66 +++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index f41f541a1..8cbc60d55 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1762,8 +1762,8 @@ Move_LAST_RESORT: waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 0, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 1, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 0, 4, 0, 12, 1 - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 0, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 4, 0, 12, 1 createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 2, 16, 0, RGB(31, 31, 31) waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 0, 1 @@ -2246,7 +2246,7 @@ Move_AQUA_TAIL: createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 1, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 0, 5 delay 3 - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 0, 3, 6, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 0, 3, 6, 1 delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 1, 0, 6 delay 10 @@ -2651,7 +2651,7 @@ GigaImpactContinuity: delay 1 createsprite gSlideMonToOffsetSpriteTemplate 2, 5, 1, -16, 0, 0, 4 waitforvisualfinish - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 4, 0, 12, 1 waitforvisualfinish delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate 2, 3, 0, 0, 5 @@ -3084,7 +3084,7 @@ Move_ZEN_HEADBUTT: delay 2 createsprite gBowMonSpriteTemplate, 2, 1, 1 waitforvisualfinish - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 0, 2, 0, 4, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 0, 2, 0, 4, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBowMonSpriteTemplate, 2, 1, 2 createsprite gAquaTailHitSpriteTemplate, 131, 4, 0, 0, 1, 1 @@ -3193,7 +3193,7 @@ Move_ROCK_CLIMB: createsprite gBasicHitSplatSpriteTemplate, 131, 4, 5, -52, 1, 1 createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 1, -25, 16, 1, 4 delay 4 - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 0, 3, 6, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 0, 3, 6, 1 delay 30 createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 0, 6 delay 4 @@ -3758,8 +3758,8 @@ Move_STONE_EDGE: delay 2 createsprite gBasicHitSplatSpriteTemplate, 131, 4, -32, -16, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 3, 0, 12, 1 - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 3, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 3, 3, 0, 12, 1 delay 4 createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -4139,8 +4139,8 @@ Move_ATTACK_ORDER: waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate 131, 4, -32, -16, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 3, 0, 12, 1 - createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 3, 0, 12, 1 delay 4 createsprite gRandomPosHitSplatSpriteTemplate 131, 2, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -4291,7 +4291,7 @@ Move_ROAR_OF_TIME: createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, -1 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL delay 0x20 - createvisualtask AnimTask_ShakeMonInPlace, 2, 1, 10, 0, 20, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan 170, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 delay 6 @@ -6346,7 +6346,7 @@ Move_DRAGON_TAIL: createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 call TailWhackDown delay 0x3 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0x0, 0x3, 0x6, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 waitforvisualfinish delay 0x5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 @@ -6469,8 +6469,8 @@ Move_DRILL_RUN: createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0xc waitforvisualfinish playse 0x14 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x0, 0x2, 0x0, 0x28, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0xa, 0x0, 0x28, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 0x4 @@ -7477,8 +7477,8 @@ Move_RELIC_SONG: waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0x3, 0x0, 0xc, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x3, 0x3, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 0x5 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -7821,8 +7821,8 @@ Move_SNARL:: waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0x3, 0x0, 0xc, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x3, 0x3, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 0x4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -7950,7 +7950,7 @@ Move_V_CREATE:: createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 0xa, 0xfff6, 0x1 waitforvisualfinish - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0x4, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1f createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x1f @@ -8145,7 +8145,7 @@ Move_BELCH:: playsewithpan SE_SUCCESS, SOUND_PAN_ATTACKER createsprite gBelchBerryTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff8, 0xfff8, 0xfff8, 0x14, 0xffe0 delay 0x13 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0xa, 0x0, 0x14, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 delay 0x6 @@ -8407,9 +8407,9 @@ Move_PETAL_BLIZZARD:: waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMonInPlace, 0x2, ANIM_TARGET, 0x3, 0x0, 0xC, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0xC, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, ANIM_ATK_PARTNER, 0x3, 0x0, 0xC, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATK_PARTNER, 3, 0, 12, 1 delay 0x4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -9019,8 +9019,8 @@ Move_DIAMOND_STORM:: @this is the buffet part createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0x3, 0x0, 0xc, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x3, 0x3, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 0x4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET @@ -10286,7 +10286,7 @@ Move_DRAGON_ASCENT:: playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0x1, -32, 0, 0, 3 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, ANIM_TARGET, 6, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) waitforvisualfinish delay 3 @@ -10427,7 +10427,7 @@ Move_FIRST_IMPRESSION:: delay 0x1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe4, 0x0, 0x0, 0x3 waitforvisualfinish - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0x4, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish delay 0xa createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x6 @@ -12578,7 +12578,7 @@ SpectralThiefUnleash: waitforvisualfinish createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 delay 0x30 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x0, 0x2, 0x0, 0x18, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 24, 1 createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0x0, 0xc, 0x77bd delay 0x18 createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0xc, 0x0, 0x77bd @@ -15560,7 +15560,7 @@ Move_PSYSHIELD_BASH:: delay 0x1 createsprite gSlideMonToOffsetSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x0, 0x0, 0x4 waitforvisualfinish - createvisualtask AnimTask_ShakeMonInPlace, 0x2, ANIM_TARGET, 0x4, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish delay 0x2 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xB, 0x0, 0x7FAF @;Light blue @@ -27176,8 +27176,8 @@ Move_BREAKNECK_BLITZ:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe6, 0x10, 0x1, 0x4 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x8, 0xfe00, 0x1, 0x0 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x0, 0x4, 0x0, 0xc, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x2, 0x1, 0x4, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish delay 0x4 createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x8, 0xfe00, 0x1, 0x1 @@ -27795,8 +27795,8 @@ FinishSavageSpinOut: loadspritegfx ANIM_TAG_CUT @cut loadspritegfx ANIM_TAG_EXPLOSION_2 @explosion loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/gray - createvisualtask AnimTask_ShakeMonInPlace, 0x82, ANIM_TARGET, 0x4, 0x0, 0xc, 0x1 - createvisualtask AnimTask_ShakeMonInPlace, 0x82, ANIM_TARGET, 0x4, 0x0, 0xc, 0x1 + createvisualtask AnimTask_ShakeMonInPlace, 130, ANIM_TARGET, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 130, ANIM_TARGET, 4, 0, 12, 1 createsprite gSavageSpinOutGreenCutSpriteTemplate, ANIM_TARGET, 2, 0x28, 0xffe0, 0x0 createsprite gSavageSpinOutGreenCutSpriteTemplate, ANIM_TARGET, 2, 0x28, 0xffd0, 0x0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET From 1d25dd0c93e6c857c5f16ebe31975b83dfac71d4 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 30 Jul 2023 23:26:59 -0400 Subject: [PATCH 094/111] Cleaned: createvisualtask AnimTask_ShakeMon2 --- data/battle_anim_scripts.s | 232 ++++++++++++++++++------------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8cbc60d55..49f07d73c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2831,7 +2831,7 @@ Move_SHADOW_CLAW: setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate ANIM_ATTACKER, 2, 6, 4 delay 4 - createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 2, 0, 18, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET @@ -3367,9 +3367,9 @@ Move_LAVA_PLUME: loadspritegfx ANIM_TAG_FIRE_PLUME loopsewithpan 152, SOUND_PAN_ATTACKER, 9, 2 createvisualtask AnimTask_BlendColorCycle, 2, 2, 2, 2, 0, 11, RGB_RED - createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 1, 0, 32, 1 - createvisualtask AnimTask_ShakeMon2 2, ANIM_DEF_PARTNER, 1, 0, 32, 1 - createvisualtask AnimTask_ShakeMon2 2, ANIM_ATK_PARTNER, 1, 0, 32, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 32, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 32, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 1, 0, 32, 1 waitforvisualfinish createsprite gLavaPlumeSpriteTemplate, 130, 1, 0 createsprite gLavaPlumeSpriteTemplate, 130, 1, 32 @@ -4520,7 +4520,7 @@ Move_SEED_FLARE: delay 2 createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0xffd8, -20, 16 delay 30 - createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 0x28, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 40, 1 createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 10, 0x900, 0x60, 1 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, 20, 1 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, -20, 1 @@ -4648,7 +4648,7 @@ ShadowForceAttack: playsewithpan SOUND_PAN_ATTACKER, 192 createvisualtask AnimTask_NightShadeClone, 5, 85 delay 70 - createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 2, 0, 12, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 createvisualtask AnimTask_BlendColorCycle 2, 4, 0, 2, 0, 13, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -5184,9 +5184,9 @@ Move_COIL: delay 0x7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff8, 0x1, 0x2 delay 0x8 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x14 - createvisualtask AnimTask_ShakeMon2, 0x83, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 131, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 0x3 playsewithpan SE_M_BIND, SOUND_PAN_TARGET setarg 0x7 0xffff @@ -5356,7 +5356,7 @@ Move_ECHOED_VOICE: loadspritegfx ANIM_TAG_METAL_SOUND_WAVES monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x2, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1 call MetalSoundPlayNote call MetalSoundPlayNote call MetalSoundPlayNote @@ -5818,7 +5818,7 @@ Move_FINAL_GAMBIT: loadspritegfx ANIM_TAG_EXPLOSION @explosion animation createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x2, 0x0, 0x8, 0x7fff waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER @@ -6539,7 +6539,7 @@ Move_HEART_STAMP: delay 0x1E clearmonbg ANIM_TARGET playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon2, 0x83, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 131, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 0x3 waitforvisualfinish end @@ -7012,7 +7012,7 @@ TechnoBlastNormal: createsprite gTechnoBlastWhiteSparkTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 delay 0x2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 @@ -7098,7 +7098,7 @@ TechnoBlastElectric: createsprite gTechnoBlastYellowSparkTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 @@ -7232,7 +7232,7 @@ TechnoBlastWater: createsprite gTechnoBlastBlueSparkTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x1 @@ -7285,7 +7285,7 @@ TechnoBlastFire: createsprite gTechnoBlastRedSparkTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40 @@ -7369,7 +7369,7 @@ TechnoBlastIce: createsprite gTechnoBlastIceSparkTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 delay 0x2 @@ -7581,7 +7581,7 @@ Move_BOLT_STRIKE:: delay 0x6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x2, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 32, 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET call ElectricityEffect createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 @@ -7718,7 +7718,7 @@ FreezeShockAttack: createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xa0, 0x28, 0x0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 delay 0xf waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 0x13 call ElectricityEffect @@ -7984,7 +7984,7 @@ Move_FUSION_FLARE:: call FusionFlareBuff delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x1F - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x1, 0x0 delay 0x8 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER @@ -8055,7 +8055,7 @@ Move_FUSION_BOLT:: createsprite gFusionBoltBallTemplate, ANIM_TARGET, 2, 0x10 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER delay 0x8 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0xa, 0x0, 0x12, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x10, 0x10 delay 0x2 @@ -8063,7 +8063,7 @@ Move_FUSION_BOLT:: delay 0x8 createvisualtask AnimTask_VoltTackleAttackerReappear, 0x5 waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x3, 0x0, 0x9, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 delay 0x2 @@ -8368,7 +8368,7 @@ Move_FORESTS_CURSE: createsprite gForestsCurseIngrainTemplate, ANIM_ATTACKER, 66, 0x8c, 0x64, 0x10, 0x1, 0x14, 0x1e, 0x1 waitforvisualfinish createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x2, 0x0, 0xe, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x02E3 delay 0x3 @@ -8467,8 +8467,8 @@ Move_DISARMING_VOICE:: createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect delay 0xA - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x1, 0x0, 0x1A, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x3, 0x1, 0x0, 0x1A, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 26, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 26, 1 waitforvisualfinish createvisualtask SoundTask_WaitForCry, 0x5 waitforvisualfinish @@ -8832,7 +8832,7 @@ Move_FAIRY_WIND:: createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x5, 0x16, 0xffee, 0x1 delay 0x5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0xfff6, 0x16, 0xf, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x2, 0x0, 0x12, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 delay 0x5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0xffec, 0x1 delay 0x5 @@ -9049,7 +9049,7 @@ Move_STEAM_ERUPTION:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x9, 0x1f call SteamEruptionBreath delay 0x2 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x2, 0x0, 0x15, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 21, 1 call SteamEruptionBreath call SteamEruptionBreath call SteamEruptionBreath @@ -9126,7 +9126,7 @@ Move_HYPERSPACE_HOLE:: end HyperspaceHoleMovement: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x3, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 15, 1 delay 0x4 return @@ -9158,7 +9158,7 @@ Move_MYSTICAL_FIRE:: loadspritegfx ANIM_TAG_FIRE setalpha 8, 8 playse 0xb1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x0, 0x2, 0x0, 0x8, 0x7fff waitforvisualfinish waitsound @@ -9642,13 +9642,13 @@ Move_HOLD_HANDS:: createsprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 0x1 delay 0x13 playsewithpan SE_M_ENCORE, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x2, 0x2, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 delay 0xe playsewithpan SE_M_ENCORE, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x2, 0x2, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 delay 0x14 playsewithpan SE_M_ENCORE, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x2, 0x3, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 3, 0, 10, 1 createvisualtask AnimTask_BlendMonInAndOut, 0x2, 0x2, 0x3ff, 0xc, 0x1, 0x1 end @@ -9666,8 +9666,8 @@ Move_BABY_DOLL_EYES:: createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffb, 0xfffb, 0xa, 0x0, 0x1 waitforvisualfinish delay 0xa - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x1, 0x0, 0x9, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x3, 0x1, 0x0, 0x9, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xA, 0x0, 0x7FFF waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -9707,7 +9707,7 @@ Move_HOLD_BACK:: playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gHoldBackSwipeTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1 waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x3, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 createsprite gHoldBackRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 createsprite gHoldBackStarsTemplate, ANIM_TARGET, 3, 0xfff0, 0xfff8, 0xa0, 0xffe0 @@ -10087,7 +10087,7 @@ Move_LIGHT_OF_RUIN:: call LightOfRuinBeam call LightOfRuinBeam call LightOfRuinBeam - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 call LightOfRuinBeam call LightOfRuinBeam call LightOfRuinBeam @@ -10363,7 +10363,7 @@ Move_HYPERSPACE_FURY:: delay 0x7 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL visible ANIM_ATTACKER - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x0, 0x3, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 0, 3, 32, 1 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET invisible ANIM_ATTACKER call UnsetPsychicBg @@ -10414,7 +10414,7 @@ Move_FIRST_IMPRESSION:: createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0x0, 0x1 playsewithpan SE_M_SKETCH, SOUND_PAN_TARGET createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 0x3 waitforvisualfinish delay 0x19 @@ -10769,7 +10769,7 @@ Move_HIGH_HORSEPOWER:: playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call SetImpactBackground createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x16, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x0, 0x7fff createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 waitforvisualfinish @@ -10873,7 +10873,7 @@ SolarBladeUnleash: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSolarBladeImpactTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1 delay 0x2 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x2, 0x0, 0xC, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS), 1, 6, 0, 0x7fff waitforvisualfinish @@ -11325,7 +11325,7 @@ Move_FIRE_LASH:: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET delay 0x4 createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x8, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x12, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET delay 0x7 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x9 @@ -11343,7 +11343,7 @@ Move_POWER_TRIP:: call PowerTripBuffUp delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp delay 0x8 call PowerTripBuffUp @@ -11723,8 +11723,8 @@ Move_CORE_ENFORCER:: monbg ANIM_TARGET createvisualtask AnimTask_CreateSmallSolarBeamOrbs, 0x5 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x5, ANIM_TARGET, 0x2, 0x0, 0x41, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x5, ANIM_DEF_PARTNER, 0x2, 0x0, 0x41, 0x1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 65, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 65, 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x0 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff5, 0xffe2, 0x1, 0x3 delay 0x1 @@ -11782,9 +11782,9 @@ Move_CORE_ENFORCER:: createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x6 delay 0x7 createsprite gCoreEnforcerSnoreTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x2, 0x0, 0x1e, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_DEF_PARTNER, 0x2, 0x0, 0x1e, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_ATK_PARTNER, 0x2, 0x0, 0x1e, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 30, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 30, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 30, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 delay 0x6 @@ -11879,7 +11879,7 @@ Move_BEAK_BLAST:: delay 0x2 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET 0x4 0x8 createvisualtask AnimTask_DrillPeckHitSplats, 0x5 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x12, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 waitforvisualfinish createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x2 waitforvisualfinish @@ -11897,7 +11897,7 @@ Move_CLANGING_SCALES:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x2002 createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 10, 10, 0x642D waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x2, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1 call ClangingScalesMetalSound call ClangingScalesMetalSound call ClangingScalesMetalSound @@ -12224,7 +12224,7 @@ Move_FLEUR_CANNON:: call FleurCannonBeam call FleurCannonBeam call FleurCannonBeam - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 call FleurCannonBeam call FleurCannonBeam call FleurCannonBeam @@ -12646,7 +12646,7 @@ SpectralThiefSteal: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SpectralThiefBuffUp delay 0x8 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SpectralThiefBuffUp delay 0x8 call SpectralThiefBuffUp @@ -12759,7 +12759,7 @@ Move_MOONGEIST_BEAM:: call MoongeistBeamOrbs call MoongeistBeamOrbs call MoongeistBeamOrbs - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0xb, 0x6739 call MoongeistBeamOrbs call MoongeistBeamOrbs @@ -12979,7 +12979,7 @@ Move_MULTI_ATTACK:: call MultiAttackBuff delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x7fff - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MultiAttackBuff delay 0x8 call MultiAttackBuff @@ -13019,9 +13019,9 @@ Move_MIND_BLOWN:: playsewithpan SE_FALL, SOUND_PAN_TARGET createsprite gMindBlownHeadTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x25 waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x2, 0x0, 0xf, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_DEF_PARTNER, 0x2, 0x0, 0xf, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_ATK_PARTNER, 0x2, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 15, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 15, 1 delay 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMindBlownBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x0 @@ -13209,7 +13209,7 @@ Move_PHOTON_GEYSER:: waitforvisualfinish monbg ANIM_TARGET createsprite gPhotonGeyserYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER unloadspritegfx ANIM_TAG_YELLOW_BALL @confuse ray (for zap cannon) unloadspritegfx ANIM_TAG_BLACK_BALL_2 @zap cannon @@ -13343,7 +13343,7 @@ Move_SNIPE_SHOT:: playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSnipeShotBallTemplate, ANIM_TARGET, 2, 0, 0, 16 waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 2, 1, 4, 0, 8, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, 0 @;Black waitforvisualfinish @@ -13426,7 +13426,7 @@ Move_TAR_SHOT:: createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0xffe8, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 0xf - createvisualtask AnimTask_ShakeMon2, 0x5, ANIM_TARGET, 0x2, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0x10, 0x0 @;Black createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET @@ -13505,7 +13505,7 @@ Move_OCTOLOCK:: delay 0x7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff8, 0x1, 0x2 delay 0x8 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x14 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0x8, 0x1f playsewithpan SE_M_BIND, SOUND_PAN_TARGET @@ -13887,8 +13887,8 @@ OverdriveRings: createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x8, 0x0, 0x3ff createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffb, 0xfffb, 0x5, 0x0, 0x0 createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x1, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x3, 0x1, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1 createvisualtask AnimTask_ShakeBattleTerrain, 0x2, 0x1, 0x0, 0x6, 0x1 createvisualtask SoundTask_WaitForCry, 0x5 return @@ -13910,7 +13910,7 @@ Move_APPLE_ACID:: createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0xffe8, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 0xf - createvisualtask AnimTask_ShakeMon2, 0x5, ANIM_TARGET, 0x2, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0x0, 0xffea, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 0xa @@ -14017,7 +14017,7 @@ Move_STRANGE_STEAM:: call StrangeSteamCloud call StrangeSteamCloud call StrangeSteamCloud - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x2, 0x0, 0x2A, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 42, 1 call StrangeSteamCloud call StrangeSteamCloud call StrangeSteamCloud @@ -14235,7 +14235,7 @@ Move_EXPANDING_FORCE:: createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xA, 0xA, 0x7DDE monbg ANIM_DEF_PARTNER call SetPsychicBackground - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_ATTACKER, 0x1, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, F_PAL_ATTACKER, 0x2, 0x0, 0x8, 0x2ff waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET @@ -14407,7 +14407,7 @@ METEOR_BEAM_BLAST: call MeteorBeamRockLaunch call MeteorBeamRockLaunch call MeteorBeamRockLaunch - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x0, 0x4, 0x51, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 0, 4, 81, 1 call MeteorBeamRockLaunch call MeteorBeamRockLaunch call MeteorBeamRockLaunch @@ -14480,7 +14480,7 @@ Move_SHELL_SIDE_ARM_SPECIAL: @ Modified Snipe Shot, placeholder playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSnipeShotBallTemplate, ANIM_TARGET, 2, 0, 0, 24 waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 2, 1, 4, 0, 8, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 waitforvisualfinish end @@ -14488,11 +14488,11 @@ Move_SHELL_SIDE_ARM_SPECIAL: @ Modified Snipe Shot, placeholder Move_MISTY_EXPLOSION:: loadspritegfx ANIM_TAG_EXPLOSION createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x8, 0x9, 0x7A5B, 0x8, 0x0, 0x8 - createvisualtask AnimTask_ShakeMon2, 0x5, 0x4, 0x8, 0x0, 0x28, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x5, 0x5, 0x8, 0x0, 0x28, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x5, 0x6, 0x8, 0x0, 0x28, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x5, 0x7, 0x8, 0x0, 0x28, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x5, 0x8, 0x8, 0x0, 0x28, 0x1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER_FORCE, 8, 0, 40, 1 call Explosion1 call Explosion1 waitforvisualfinish @@ -14743,8 +14743,8 @@ Move_BURNING_JEALOUSY:: delay 0x8 call BurningJealousyFlames playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x2, 0x0, 0xC, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_DEF_PARTNER, 0x2, 0x0, 0xC, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 12, 1 createvisualtask AnimTask_BlendMonInAndOut, 0x3, ANIM_TARGET, 0x1f, 0xc, 0x1, 0x1 createvisualtask AnimTask_BlendMonInAndOut, 0x3, ANIM_DEF_PARTNER, 0x1f, 0xc, 0x1, 0x1 call FireSpreadEffect @ INCINERATE_BURN_CHANCE @@ -14786,7 +14786,7 @@ Move_LASH_OUT:: call PowerTripBuffUp delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x1F - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp delay 0x8 call PowerTripBuffUp @@ -15122,7 +15122,7 @@ Move_WICKED_BLOW:: call WickedBlowBuffEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call WickedBlowBuffEffect delay 0x8 call WickedBlowBuffEffect @@ -15186,7 +15186,7 @@ SURGING_STRIKES_0: playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSpriteTemplate_SurgingStrikesImpact, ANIM_TARGET, 2, 40, 20, 0, 0, 10, 20 @Bottom right createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 1, -5, -5, ANIM_TARGET, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 delay 5 createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 1, 5, 5, ANIM_TARGET, 0x1 waitforvisualfinish @@ -15199,7 +15199,7 @@ SURGING_STRIKES_1: playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSpriteTemplate_SurgingStrikesImpact, ANIM_TARGET, 2, -40, 20, 0, 0, 10, 20 @Bottom left createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 1, 5, -5, ANIM_TARGET, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 delay 5 createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 1, -5, 5, ANIM_TARGET, 0x1 waitforvisualfinish @@ -15212,7 +15212,7 @@ SURGING_STRIKES_2: playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSpriteTemplate_SurgingStrikesImpact, ANIM_TARGET, 2, 40, -20, 0, 0, 10, -20 @Top Right createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 1, -5, -5, ANIM_TARGET, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x0, 0x4, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 0, 4, 8, 1 delay 5 createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 1, 5, -5, ANIM_TARGET, 0x1 waitforvisualfinish @@ -15349,8 +15349,8 @@ Move_FIERY_WRATH:: waitforvisualfinish loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_DEF_SIDE, 0x4, 0x0, 0xF, 0x3006 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x4, 0x0, 0x3C, 0x1 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_DEF_PARTNER, 0x4, 0x0, 0x3C, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 60, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 4, 0, 60, 1 call FieryWrathGeyser call FieryWrathGeyser call FieryWrathGeyser @@ -15439,7 +15439,7 @@ Move_THUNDEROUS_KICK:: delay 0x7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x4, 0x0, 0x16, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x7fff createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 waitforvisualfinish @@ -15535,7 +15535,7 @@ Move_DIRE_CLAW:: delay 0x2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x24, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 36, 1 delay 0x2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0 @@ -15721,7 +15721,7 @@ Move_RAGING_FURY:: call OutrageFlames call OutrageFlames delay 10 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x4, 0x0, 0x18, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 24, 1 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET call FlameBurstSpread waitforvisualfinish @@ -15888,7 +15888,7 @@ Move_HEADLONG_RUSH:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x2a, 0x0, 0x0, 0x5 createsprite gSpriteTemplate_HeadlongRushImpact, ANIM_TARGET, 4, 0xfff6, 0x0, 0x1, 0x0 delay 0x5 - createvisualtask AnimTask_ShakeMon2, 0x5, ANIM_TARGET, 0x4, 0x0, 0x2C, 0x1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 44, 1 call MaxQuake_DirtGeyser call MaxQuake_DirtGeyser waitforvisualfinish @@ -15999,7 +15999,7 @@ Move_ESPER_WING:: playsewithpan SE_M_WING_ATTACK, SOUND_PAN_ATTACKER delay ESPER_WING_SPEED / 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x4, 0x0, 0xC, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 12, 1 call WingAttackFeatherScatter waitforvisualfinish call UnsetPsychicBg @@ -16028,7 +16028,7 @@ Move_BITTER_MALICE:: loadspritegfx ANIM_TAG_ICE_CRYSTALS playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createvisualtask AnimTask_ScaryFace, 0x5 @ internally checks side - createvisualtask AnimTask_ShakeMon2, 0x5, 0x1, 0x2, 0x0, 0x4C, 0x1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 76, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xF, 0x3006 @;Dark Purple createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PURPLE_RING, 0x4, 0x0, 0xE, 0x3006 @;Dark Purple call BitterMaliceSwirl @@ -16089,7 +16089,7 @@ Move_TRIPLE_ARROWS:: playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, 40, 0, 0, 0, TRIPLE_ARROW_FLY_TIME delay 0x3 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x3, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createvisualtask AnimTask_IsAttackerPlayerSide, 0x2, jumpargeq 0x7, FALSE, TripleArrowsOnOpponent @@ -16161,7 +16161,7 @@ Move_CEASELESS_EDGE:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_TARGET), 0x0, 0x10, 0x10, 0x0 @;Fully to to, Black createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xa, delay 0x10 - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x3, 0x0, 0x30, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 48, 1 call CeaselessEdgeSlashes call CeaselessEdgeSlashes call CeaselessEdgeSlashes @@ -27207,7 +27207,7 @@ Move_ALL_OUT_PUMMELING: call EndureEffect loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER 0x9 0x2 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x1f - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect waitforvisualfinish fadetobg BG_ROCK_WRECKER @@ -27574,7 +27574,7 @@ Move_CONTINENTAL_CRUSH:: call ContinentalCrashBuffEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x2dd3 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call ContinentalCrashBuffEffect delay 0x8 call ContinentalCrashBuffEffect @@ -27607,14 +27607,14 @@ FinishContinentalCrush: visible ANIM_ATTACKER delay 0x4 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x2dd3 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call ContinentalCrushStockpileRocks playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call ContinentalCrushStockpileRocks createsprite gContinentalCrushGrowingRockSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x2dd3 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call ContinentalCrushStockpileRocks playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER @@ -27875,7 +27875,7 @@ Move_NEVER_ENDING_NIGHTMARE:: call NeverendingNightmareBuffEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x40c0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call NeverendingNightmareBuffEffect delay 0x8 call NeverendingNightmareBuffEffect @@ -28212,7 +28212,7 @@ FinishInfernoOverdrive: createsprite gInfernoOverdriveSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 @ super power shot playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER delay 0x10 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x8, 0x0, 0x10, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x2, 0x4f, 0x1 @@ -28323,7 +28323,7 @@ Move_HYDRO_VORTEX:: loadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_WATERFALL, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5da0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 waitforvisualfinish unloadspritegfx ANIM_TAG_SPLASH unloadspritegfx ANIM_TAG_SWEAT_BEAD @@ -28472,7 +28472,7 @@ Move_BLOOM_DOOM:: call BloomDoomHyperBeam call BloomDoomHyperBeam call BloomDoomHyperBeam - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x72, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 114, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0xb, 0x33ed call BloomDoomHyperBeam call BloomDoomHyperBeam @@ -28974,7 +28974,7 @@ SubzeroSlammerFinish: waitforvisualfinish call SubzeroSlammerIceSwirl createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x7e80 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SubzeroSlammerIceSwirl call SubzeroSlammerIceSwirl delay 0xa @@ -28987,7 +28987,7 @@ SubzeroSlammerFinish: call IceBeamCreateCrystals call IceBeamCreateCrystals createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x7, 0x7e80 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x2, 0x0, 0x19, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals @@ -29086,7 +29086,7 @@ Move_DEVASTATING_DRAKE:: call DevastatingDrakeBuffEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x40c0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call DevastatingDrakeBuffEffect delay 0x8 call DevastatingDrakeBuffEffect @@ -29311,7 +29311,7 @@ Move_BLACK_HOLE_ECLIPSE:: call EndureEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x0000 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 0x8 call EndureEffect @@ -29607,7 +29607,7 @@ Move_CATASTROPIKA:: call EndureEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 0x8 call EndureEffect @@ -29892,12 +29892,12 @@ Move_10000000_VOLT_THUNDERBOLT:: @ createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, ANIM_TAG_ORBS, 0x1, 0xc, 0x1f, 0x10, 0x0, 0x0 call TenMillionVoltThunderboltBeamRed call TenMillionVoltThunderboltBeamBlue - createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x4, 0x0, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE call TenMillionVoltThunderboltBeamPink call TenMillionVoltThunderboltBeamYellow call TenMillionVoltThunderboltBeamGreen - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 call TenMillionVoltThunderboltBeamPurple call TenMillionVoltThunderboltBeamRed call TenMillionVoltThunderboltBeamBlue @@ -30077,7 +30077,7 @@ StokedSparksurferFinish: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x1c, 0x2, 0xc - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x3c, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 60, 1 call EndureEffect delay 0x8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x5, 0x0, 0x10, 0x5bff @@ -30436,14 +30436,14 @@ Move_GENESIS_SUPERNOVA:: GenesisSupernovaOnOpponent: call GenesisSupernovaBuffEffectPlayer_1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0xd87c - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x70, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 112, 1 call GenesisSupernovaBuffEffectPlayer_2 call GenesisSupernovaBuffEffectPlayer_1 goto GenesisSupernovaFinish GenesisSupernovaOnPlayer: call GenesisSupernovaBuffOpponent_1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0xd87c - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x70, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 112, 1 call GenesisSupernovaBuffOpponent_2 call GenesisSupernovaBuffOpponent_1 GenesisSupernovaFinish: @@ -31051,7 +31051,7 @@ Move_OCEANIC_OPERETTA:: call OceanicOperettaBuffEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x7fff - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call OceanicOperettaBuffEffect delay 0x8 call OceanicOperettaBuffEffect @@ -31255,7 +31255,7 @@ SplinteredStormshardsByPlayer: delay 0x1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 delay 0x2 call SplinteredStormshardsPlayer_Rising2 call SplinteredStormshardsPlayer_Rising1 @@ -31337,7 +31337,7 @@ SplinteredStormshardsByOpponent: delay 0x1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 delay 0x2 call SplinteredStormshardsOpponent_Rising2 call SplinteredStormshardsOpponent_Rising1 @@ -32004,7 +32004,7 @@ Move_SEARING_SUNRAZE_SMASH:: delay 0x8 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x7fff - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SearingSunrazeSmashFlare delay 0x8 call SearingSunrazeSmashFlare @@ -32235,7 +32235,7 @@ Move_MENACING_MOONRAZE_MAELSTROM:: call MenacingMoonrazeMaelstromFlare delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xc, 0x0000 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MenacingMoonrazeMaelstromFlare playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER delay 0x8 @@ -32295,7 +32295,7 @@ MenacingMoonrazeMaelstromFinish: playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call MenacingMoonrazeMaelstromChargeUp createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xc, 0x0000 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MenacingMoonrazeMaelstromChargeUp call MenacingMoonrazeMaelstromChargeUp createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 @@ -32304,7 +32304,7 @@ MenacingMoonrazeMaelstromFinish: call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x3c, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 60, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x4, 0x0, 0xc, 0x0000 call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam @@ -32337,7 +32337,7 @@ MenacingMoonrazeMaelstromFinish: unloadspritegfx ANIM_TAG_ORBS @hyper beam unloadspritegfx ANIM_TAG_HANDS_AND_FEET @black loadspritegfx ANIM_TAG_EXPLOSION_2 @explosion - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x4c, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 76, 1 call MenacingMoonrazeMaelstromExplosion call MenacingMoonrazeMaelstromExplosion createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS), 0x2, 0x0, 0x10, 0x7fff @@ -32424,7 +32424,7 @@ Move_LIGHT_THAT_BURNS_THE_SKY:: call EndureEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 0x8 call EndureEffect @@ -32601,7 +32601,7 @@ Move_SOUL_STEALING_7_STAR_STRIKE:: call SoulStealingSevenStarStrikeBuffEffect delay 0x8 createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x0 - createvisualtask AnimTask_ShakeMon2, 0x2, 0x0, 0x1, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SoulStealingSevenStarStrikeBuffEffect delay 0x8 call SoulStealingSevenStarStrikeBuffEffect From b4ad3be0cb7db11e9140ce04a7bd525df3400ea9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 00:15:48 -0400 Subject: [PATCH 095/111] Cleaned: createvisualtask AnimTask_ShakeMon --- data/battle_anim_scripts.s | 386 ++++++++++++++++++------------------- 1 file changed, 193 insertions(+), 193 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 49f07d73c..8b3ae78e0 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1732,7 +1732,7 @@ Move_PUNISHMENT: setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPunishmentImpactSpriteTemplate 2, 4, 0, 0, 1, 2 - createvisualtask AnimTask_ShakeMon 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -2568,7 +2568,7 @@ Move_EARTH_POWER: playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET delay 40 loopsewithpan 145, SOUND_PAN_TARGET 11, 3 - createvisualtask AnimTask_ShakeMon 5, 5, ANIM_TARGET, 0, 3, 25, 1 + createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gDragonRageFirePlumeSpriteTemplate, 194, 3, 1, 5, 0 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, 194, 3, 1, -10, -15 @@ -2981,7 +2981,7 @@ Move_SHADOW_SNEAK: end ShadowSneakMovement: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x4 return @@ -3580,7 +3580,7 @@ Move_GUNK_SHOT: splitbgprio ANIM_TARGET setalpha 12, 8 call SetGunkShotBG - createvisualtask AnimTask_ShakeMon 5, 5, ANIM_ATTACKER, 0, 2, 40, 1 + createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_ATTACKER, 0, 2, 40, 1 delay 6 panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 createvisualtask AnimTask_StartSinAnimTimer, 5, 1, 100 @@ -5161,7 +5161,7 @@ Move_FLAME_CHARGE: delay 0x3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x6, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 call FireSpreadEffect playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_ATTACKER waitforvisualfinish @@ -5241,7 +5241,7 @@ Move_FOUL_PLAY: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 delay 0x6 createsprite gFoulPlayImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS), 0x3, 0xa, 0x0, 0x0 createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 @@ -5311,7 +5311,7 @@ Move_ENTRAINMENT: playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER delay 0x18 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x1f, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 31, 1 waitforvisualfinish end @@ -5380,7 +5380,7 @@ Move_CHIP_AWAY: setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 delay 0x4 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x5, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x1, 0x1 playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET waitforvisualfinish @@ -5540,7 +5540,7 @@ Move_SHELL_SMASH: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x8, 0x1, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, 1, 3, 0, 5, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x18, 0xe, 0x2 @@ -5551,7 +5551,7 @@ Move_SHELL_SMASH: createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0xffee, 0x8, 0x2 createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0x12, 0x8, 0x2 createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0xffee, 0x8, 0x2 - createvisualtask AnimTask_ShakeMon, 2, 1, 0, 3, 7, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 waitforvisualfinish end @@ -5596,7 +5596,7 @@ Move_HEX: playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitbgfadein createvisualtask AnimTask_PurpleFlamesOnTarget, 0x3 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x2, 0x0, 0x25, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 37, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET delay 0x20 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xc, 0x4C4A @;Deep purple @@ -5634,7 +5634,7 @@ SkyDropUnleash: delay 0x7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x0 - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x5, 0xb, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -5747,7 +5747,7 @@ Move_ACROBATICS: delay 7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 0 - createvisualtask AnimTask_ShakeMon, 5, 1, 0, 5, 11, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -5805,7 +5805,7 @@ Move_RETALIATE: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x10, 0x43D waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x043D waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -5825,14 +5825,14 @@ Move_FINAL_GAMBIT: createsprite gFinalGambitBlueYawnTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x25 delay 0x4 waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffc, 0xfffc, 0xf, 0x1, 0x1 waitforvisualfinish monbg ANIM_TARGET delay 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gFinalGambitExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish clearmonbg ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @@ -5853,7 +5853,7 @@ Move_INFERNO: loadspritegfx ANIM_TAG_SMALL_EMBER call SetImpactBackground loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 40, 4 - createvisualtask AnimTask_ShakeMon, 5, 1, 0, 2, 94, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 94, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 9, RGB_RED call InfernoAnim call InfernoAnim @@ -6230,7 +6230,7 @@ Move_VOLT_SWITCH: delay 4 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 delay 4 - createvisualtask AnimTask_ShakeMon, 5, 1, 0, 3, 45, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 45, 1 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 delay 4 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 @@ -6298,14 +6298,14 @@ Move_FROST_BREATH: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x300, 0x0, 0x0, 0xffff waitbgfadein playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x5, 0x0, 0x0, 0x2, 0x28, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xf, 0x0, 0x0, 0x4 waitforvisualfinish createsprite gFrostBreathBlueBreathTemplate, ANIM_TARGET, 2, 0x1e, 0xf, 0x0, 0xa, 0xa waitforvisualfinish loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0xb, 0x3 - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x3, 0x19, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0x5, 0x0 delay 0x1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0xfff6, 0xfff1 @@ -6441,7 +6441,7 @@ Move_WILD_CHARGE: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1a, 0x0, 0x0, 0x5 delay 0x6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0x10, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call ElectricityEffect waitforvisualfinish @@ -6519,13 +6519,13 @@ Move_DUAL_CHOP: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 delay 0x6 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x5, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @left createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0x0515, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @right waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gDualChopImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -6552,7 +6552,7 @@ Move_HORN_LEECH: playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER createsprite gHornLeechHornTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x25 waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x5, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET call GigaDrainAbsorbEffect @@ -6580,7 +6580,7 @@ Move_SACRED_SWORD: createsprite gSacredSwordBladesTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xFF00, 0xA createsprite gSacredSwordCutTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x0, 0x3, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -6595,7 +6595,7 @@ Move_RAZOR_SHELL: playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 1, 0x28, 0xffe0, 0x0 delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET waitforvisualfinish @@ -6611,12 +6611,12 @@ Move_HEAT_CRASH: createsprite gHeatCrashEruptionRockTemplate, ANIM_ATTACKER, 3, 0x0, 0xffe0, 0xf delay 0x13 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff8, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0x9, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 9, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 0x5 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff8, 0x1, 0x1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 0xfff4, 0x20, 0x3, 0x4 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 0x8, 0x1f, 0x2, 0x2 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 0xfffc, 0x1c, 0x2, 0x3 @@ -6631,7 +6631,7 @@ Move_LEAF_TORNADO: monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x2, 0x2f, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1 createsprite gEllipticalGustSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 createvisualtask AnimTask_AnimateGustTornadoPalette, 0x5, 0x1, 0x46 call LeafTornadoVortex @@ -6739,7 +6739,7 @@ Move_NIGHT_DAZE: delay 0x1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x1f, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 31, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x2002 delay 0x6 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER @@ -6775,7 +6775,7 @@ Move_TAIL_SLAP: setalpha 12, 8 choosetwoturnanim TailSlapRight TailSlapLeft TailSlapContinue: - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -6798,7 +6798,7 @@ Move_HURRICANE: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x1000, 0x0, 0x1, 0xffff waitbgfadein playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0x40, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 64, 1 call HurricaneGust delay 0xA call HurricaneGust @@ -6831,8 +6831,8 @@ Move_HEAD_CHARGE: delay 0x2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x1 waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, 0x0, 0x2, 0x0, 0x4, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x5, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 2, 0, 4, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x2 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -6851,13 +6851,13 @@ Move_GEAR_GRIND: createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x0, 0xfccd, 0xfccd, 0xa delay 0xa createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x7, 0x5, 0x2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 waitforvisualfinish createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x0, 0xfccd, 0x333, 0xa createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x0, 0x333, 0xfccd, 0xa delay 0xa createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x8, 0x4, 0x2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 waitforvisualfinish stopsound clearmonbg ANIM_TARGET @@ -6929,9 +6929,9 @@ Move_SEARING_SHOT: monbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ADJACENT, 0x2, 0x0, 0x9, 0x1F playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x1B, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x1B, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATK_PARTNER, 0x3, 0x0, 0x1B, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 27, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 27, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 3, 0, 27, 1 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, -5, -5, 0x1, 0x1E, ANIM_TARGET createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, 5, 10, 0x1, 0x1E, ANIM_TARGET @@ -7514,7 +7514,7 @@ Move_SECRET_SWORD: createsprite gSecretSwordBladesTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xFF00, 0xA createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x0, 0x3, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x0 waitforvisualfinish @@ -7672,7 +7672,7 @@ Move_FIERY_DANCE:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xc, 0x14be waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x2, 0x40, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 64, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x9, 0x1f call FireSpinEffect call FireSpinEffect @@ -7854,7 +7854,7 @@ Move_ICICLE_CRASH:: delay 0x2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffe9, 0x0, 0xfff6, 0x1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x5, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 delay 0x2 call LaunchIcicleCrashSpear call LaunchIcicleCrashSpear @@ -7929,7 +7929,7 @@ Move_V_CREATE:: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 delay 0x23 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x5, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x1f playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 @@ -8739,7 +8739,7 @@ Move_ELECTRIFY:: monbg ANIM_DEF_PARTNER playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 delay 0x1 createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 @@ -9363,7 +9363,7 @@ GeomancyChargeUp: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 waitforvisualfinish playsewithpan SE_M_COSMIC_POWER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x5f, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 95, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x1F call GeomancyRingBuff createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x2C0 @@ -9442,7 +9442,7 @@ GeomancyUnleash: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x10, 0x4D01 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x25, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 37, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x1F createsprite gGeomancyRedCellRaiseTemplate, ANIM_ATTACKER, 2, 0x14, 0x20, 0xffd0, 0x32, 0x1 createsprite gGeomancyGreenCellRaiseTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0xffda, 0x19, 0x1 @@ -9728,7 +9728,7 @@ Move_INFESTATION:: monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7320 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x4f, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 79, 1 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0x0, 0x4F call InfestationVortex call InfestationVortex @@ -9786,7 +9786,7 @@ Move_OBLIVION_WING:: createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 call OblivionWingBeam call OblivionWingBeam - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 40, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 40, 1 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x4, 0x0, 0xc, 0x289F @Pinkish Red call OblivionWingBeam call OblivionWingBeam @@ -10080,7 +10080,7 @@ Move_LIGHT_OF_RUIN:: createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x14, 0x0, 0x2 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x6B1F - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x0, 0x4, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 call LightOfRuinBeam call LightOfRuinBeam @@ -10115,7 +10115,7 @@ Move_LIGHT_OF_RUIN:: delay 0x2 createsprite gLightOfRuinPinkDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x5, 0xb, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 createsprite gLightOfRuinPinkExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 delay 0x10 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF @@ -10322,7 +10322,7 @@ Move_HYPERSPACE_FURY:: createvisualtask AnimTask_SetPsychicBackground, 0x5 waitbgfadein loopsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET, 0x2, 0x10 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 32, 1 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 call HyperspaceFuryRandomImpact delay 0x2 @@ -10474,7 +10474,7 @@ Move_SPIRIT_SHACKLE:: playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xf delay 0x8 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 10, 1 waitforvisualfinish loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 0x1c, 0x2 createsprite gSpiritShackleChainTemplate, ANIM_TARGET, 2, 0xfff0, 0xfff0 @@ -10552,44 +10552,44 @@ Move_SPARKLING_ARIA:: end SparklingAriaRain: createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xdc, 0x3c - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0x3c, 0x64 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x8c, 0x37 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xb4, 0x32 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x14, 0x5a - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0x5a, 0x5a - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xa0, 0x3c - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x1e, 0x5a - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x78, 0x3c - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0xc8, 0x28 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 delay 0x2 return SparklingAriaCharge: @@ -11054,7 +11054,7 @@ Move_THROAT_CHOP:: delay 0x3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 waitforvisualfinish @@ -11106,7 +11106,7 @@ PollenPuffOpponent: createsprite gPollenPuffSporeTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x0, 0x0, 0x19, 0xffe0 waitforvisualfinish playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0xFFE0, 0x10 @up createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0xFFEE, 0xFFEE, 0x10 @upperleft createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x1C, 0x10 @down @@ -11186,9 +11186,9 @@ Move_ANCHOR_SHOT:: createsprite gAnchorShotAngledAnchorTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x35 waitforvisualfinish createsprite gAnchorShotAnchorTemplate, ANIM_ATTACKER, 3, 0x0, 0xffe0, 0xf - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 delay 0x25 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER 0x1c 0x2 createsprite gAnchorShotChainTemplate, ANIM_TARGET, 2, 0xfff0, 0xfff0 @@ -11246,7 +11246,7 @@ Move_LUNGE:: loadspritegfx ANIM_TAG_RAZOR_LEAF @green loadspritegfx ANIM_TAG_SMALL_BUBBLES @ball monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x3, 0x0, 0xf0, 0x0 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 240, 0 loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gLungeGreenChargeTemplate, ANIM_ATTACKER, 2 delay 0x6e @@ -11267,7 +11267,7 @@ Move_LUNGE:: createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffce, 0xffd8, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffd8, 0x28, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x32, 0xffce, 0x6 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x5, 0xb, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 delay 0x2 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x32, 0xffe2, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x3c, 0xa, 0x6 @@ -11317,7 +11317,7 @@ Move_FIRE_LASH:: waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x6 delay 0x4 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x5, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1 createvisualtask AnimTask_BlendMonInAndOut, 0x3, 0x1, 0x1f, 0xc, 0x1, 0x1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_SLASH @@ -11350,15 +11350,15 @@ Move_POWER_TRIP:: waitforvisualfinish playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0xFFF5, 0xA, 0x1, 0x2 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0xFFF5, 0x1, 0x2 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0xA, 0x0, 0x1, 0x2 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -11397,7 +11397,7 @@ Move_BURN_UP:: createvisualtask AnimTask_CopyPalUnfadedToBackup, 0x5, 0x1, 0x0 delay 0x1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xd, 0x1c - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x2, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish delay 0x1E createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 @@ -11408,7 +11408,7 @@ Move_BURN_UP:: createvisualtask AnimTask_CopyPalFadedToUnfaded, 0x5, 0x1 delay 0x1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x0, 0xd, 0x4a52 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x3, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 3, 0, 15, 1 delay 0xF createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0xC, 0x1C delay 0x1 @@ -11419,7 +11419,7 @@ Move_BURN_UP:: createvisualtask AnimTask_CopyPalUnfadedFromBackup, 0x5, 0x1, 0x0 delay 0x1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x2, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 15, 1 call FireSpreadEffect waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xd, 0x0, 0x4a52 @@ -11486,7 +11486,7 @@ Move_SMART_STRIKE:: splitbgprio ANIM_TARGET setalpha 12, 8 call SonicBoomProjectile - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0xa, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 10, 1 loadspritegfx ANIM_TAG_FLASH_CANNON_BALL createsprite gSmartStrikeImpactTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x8, 0x1, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -11583,7 +11583,7 @@ Move_REVELATION_DANCE:: createsprite gRevelationDanceYellowDispersalTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0xa0, 0x30, 0x28 createsprite gRevelationDanceYellowDispersalTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0xff20, 0xffe0, 0x28 createsprite gRevelationDanceYellowDispersalTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x70, 0xff80, 0x28 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x0 waitforvisualfinish @@ -11814,7 +11814,7 @@ Move_TROP_KICK:: loadspritegfx ANIM_TAG_FLOWER @flowers monbg ANIM_DEF_PARTNER createsprite gTropKickGreenFootTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x8, 0x0, 0x0, 0xa, 0x1, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 0xA playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER @@ -11844,7 +11844,7 @@ Move_INSTRUCT:: delay 0x4 monbg ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 0x5, 0x0, 0x37b, 0xc, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x29, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 41, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET delay 0x1A createvisualtask AnimTask_BlendMonInAndOut, 0x5, 0x0, 0x37b, 0xc, 0x1, 0x1 @@ -11903,8 +11903,8 @@ Move_CLANGING_SCALES:: call ClangingScalesMetalSound call ClangingScalesMetalSound delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 15, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 0x0 @@ -11972,9 +11972,9 @@ Move_BRUTAL_SWING:: delay 0x6 createsprite gBrutalSwingBasicImpactTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0x15, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x0, 0x3, 0x15, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATK_PARTNER, 0x0, 0x3, 0x15, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 0, 3, 21, 1 delay 0x4 createsprite gBrutalSwingRandomImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -12219,7 +12219,7 @@ Move_FLEUR_CANNON:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x7440 waitforvisualfinish panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x0, 0x4, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 call FleurCannonBeam call FleurCannonBeam @@ -12248,7 +12248,7 @@ Move_FLEUR_CANNON:: delay 0x2 createsprite gFleurCannonDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x5, 0xb, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7440 waitforvisualfinish @@ -12279,14 +12279,14 @@ PsychicFangsRegular: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa delay 0xa createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x7, 0x5, 0x2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 delay 0x10 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x3, 0x333, 0xfccd, 0xa delay 0xa createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x8, 0x4, 0x2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 PsychicFangsEnd: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET waitforvisualfinish @@ -12301,7 +12301,7 @@ PsychicFangsDestroyWall: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa delay 0xa createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x7, 0x5, 0x2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 delay 0x10 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa @@ -12313,7 +12313,7 @@ PsychicFangsDestroyWall: createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2, 0xfff8, 0xc createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3, 0x8, 0xc playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x8, 0x4, 0x2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 delay 0x10 goto PsychicFangsEnd @@ -12366,12 +12366,12 @@ Move_SHADOW_BONE:: createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, 0xffd6, 0xffe7, 0x0, 0x0, 0xf delay 0xc createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x5, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_NightmareClone, 0x2 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0x28, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 40, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET waitforvisualfinish restorebg @@ -12389,7 +12389,7 @@ Move_ACCELEROCK:: createvisualtask AnimTask_TraceMonBlended, 0x2, 0x0, 0x4, 0x7, 0x3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 0x4 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x5, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x1, 0x1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3, 0x0, 0x5, 0x1 @@ -12413,7 +12413,7 @@ Move_LIQUIDATION:: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 delay 0x6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET waitforvisualfinish call RisingWaterHitEffect @@ -12598,31 +12598,31 @@ SpectralThiefUnleash: delay 0x1 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish visible ANIM_ATTACKER delay 0x2 @@ -12705,7 +12705,7 @@ Move_SUNSTEEL_STRIKE:: createsprite gSunsteelStrikeSuperpowerTemplate, ANIM_TARGET, 2, 0x14 delay 0x14 createsprite gSunsteelStrikeRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x6, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish unloadspritegfx ANIM_TAG_METEOR @superpower unloadspritegfx ANIM_TAG_GOLD_RING @beam @@ -12752,7 +12752,7 @@ Move_MOONGEIST_BEAM:: call MoongeistBeamCharge delay 0x20 createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xCC, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x0, 0x4, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 call MoongeistBeamOrbs call MoongeistBeamOrbs @@ -12844,16 +12844,16 @@ Move_ZING_ZAP:: loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color monbg ANIM_TARGET call ZingZapSparks1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 delay 0xA call ZingZapSparks2 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 delay 0xA call ZingZapSparks1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 delay 0xA call ZingZapSparks2 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 delay 0xA createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 delay 0x4 @@ -12867,7 +12867,7 @@ Move_ZING_ZAP:: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gZingZapRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 call ElectricityEffect visible ANIM_ATTACKER waitforvisualfinish @@ -12959,11 +12959,11 @@ Move_NATURES_MADNESS:: createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x1 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x1 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0003, 0x0000, 0x0006, 0x0001 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -12988,7 +12988,7 @@ Move_MULTI_ATTACK:: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffd0, 0x0 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 waitforvisualfinish @@ -13075,7 +13075,7 @@ Move_PLASMA_FISTS:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 waitforvisualfinish createsprite gPlasmaFistsChargeTemplate, ANIM_ATTACKER, 2, 0x0 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x0, 0x3, 0x5c, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 3, 92, 1 call PlasmaFistSpark1 delay 0xA call PlasmaFistSpark2 @@ -13144,7 +13144,7 @@ PlasmaFistsImpact: playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 delay 0x2 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 return @@ -13217,7 +13217,7 @@ Move_PHOTON_GEYSER:: @Shoot beam to the sky loadspritegfx ANIM_TAG_STRAIGHT_BEAM createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0x10, 0x43FF @Light yellow - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x4, 0x0, 0x60, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 96, 1 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 call PhotonGeyserBeam waitforvisualfinish @@ -13361,7 +13361,7 @@ Move_JAW_LOCK:: createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa, 15 delay 0xa createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x7, 0xA, 0x2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 10, 2 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x0 @;Black waitforvisualfinish @@ -13475,7 +13475,7 @@ Move_DRAGON_DARTS:: createsprite gDreepyMissileTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x19 delay 0x19 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x10, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 16, 1 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 waitforvisualfinish end @@ -13529,7 +13529,7 @@ Move_BOLT_BEAK:: waitforvisualfinish createsprite gFlashingHitSplatSpriteTemplate, 0x83, 0x4, 0x0, 0x0, 0x1, 0x1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 0x2, 0x4, 0xffe1, 0x2, 0x0, 0x6, 0x5bff call ElectricityEffect @@ -13572,7 +13572,7 @@ Move_FISHIOUS_REND:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x726A @Blue Teeth playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createsprite gFishiousRendTeethTemplate, ANIM_TARGET, 0, 50, 4 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x4, 0x0, 0xC, 0x2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 12, 2 call FishousRendBubbles waitforvisualfinish end @@ -13719,7 +13719,7 @@ Move_DRUM_BEATING:: delay 0x5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xfff6, 0x1, 0x3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x3, ANIM_TARGET, 0x8, 0x0, 0x14, 0x1 + createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 8, 0, 20, 1 delay 0x3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xa, 0x8, 0x1, 0x3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET @@ -13764,7 +13764,7 @@ Move_PYRO_BALL:: createsprite gPyroBallEmberBallTemplate, ANIM_ATTACKER, 2, 0, 10, 0, 5, 20, -20 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xc, 0x1f - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect delay 0x20 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x043D @@ -13811,7 +13811,7 @@ Move_AURA_WHEEL:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0x0, 0x0, 0x6 delay 0x4 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x5, 0x0, 0x17, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 23, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 2, 12, 0, 0x76E1 @Revert blue Electricity createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x8003 @@ -13835,8 +13835,8 @@ Move_BREAKING_SWIPE:: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0x15, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x0, 0x3, 0x15, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 delay 0x4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 @@ -13861,7 +13861,7 @@ Move_BRANCH_POKE:: playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER createsprite gBranchPokeBranchTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x25 waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x5, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET waitforvisualfinish @@ -13996,7 +13996,7 @@ Move_SPIRIT_BREAK:: call MindReaderEyeSpikeEffect call MindReaderEyeSpikeEffect waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x5, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 5, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gSpriteTemplate_SpiritBreakExplode, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 waitforvisualfinish @@ -14108,7 +14108,7 @@ Move_FALSE_SURRENDER:: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x7fff, 0xa, 0x0, 0xa createsprite gSpriteTemplate_LargeCrossImpact, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x14 - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x7, 0x0, 0x9, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -14139,7 +14139,7 @@ Move_METEOR_ASSAULT:: playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 0xF createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 0x10, 0x10, 0x7FFF @Screen flash white - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x5, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 32, 1 call BasicExplosion call BasicExplosion waitforvisualfinish @@ -14255,8 +14255,8 @@ EXPANDING_FORCE_BOTH_TARGETS: createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_TARGET createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_DEF_PARTNER waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x5, 0x0, 0x18, 0x1 @;High power - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_DEF_PARTNER, 0x5, 0x0, 0x18, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 24, 1 @;High power + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 0, 24, 1 call ExpandingForceExplosionGeyser waitforvisualfinish call UnsetPsychicBg @@ -14372,7 +14372,7 @@ Move_SCALE_SHOT:: waitforvisualfinish playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 delay 0x10 stopsound waitforvisualfinish @@ -14403,7 +14403,7 @@ METEOR_BEAM_BLAST: waitbgfadein monbg ANIM_TARGET panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER SOUND_PAN_TARGET 0x2 0x0 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x0, 0x4, 0x57, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 87, 1 call MeteorBeamRockLaunch call MeteorBeamRockLaunch call MeteorBeamRockLaunch @@ -14725,7 +14725,7 @@ Move_SKITTER_SMACK:: Move_BURNING_JEALOUSY:: loadspritegfx ANIM_TAG_SMALL_EMBER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x2A, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 42, 1 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0x8, 0x1F call BurningJealousyFireBuffEffect delay 0x8 @@ -14840,12 +14840,12 @@ Move_POLTERGEIST:: waitforvisualfinish setalpha 12, 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x5, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_NightmareClone, 0x2 - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0x28, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 40, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET waitforvisualfinish restorebg @@ -14907,7 +14907,7 @@ Move_FLIP_TURN:: waitforvisualfinish playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x2 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createsprite gSpriteTemplate_FlipTurnBack, ANIM_ATTACKER, 3, 0x0, 0xFFF1, 0xFFF0, 0x24 waitforvisualfinish visible ANIM_ATTACKER @@ -14932,7 +14932,7 @@ TripleAxelTurn0: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0xfff0, 0x1, 0x2 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0xfff0, 0xfff8, 0xff00, 0xffd8 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0xfff0, 0xfff8, 0x1a0, 0xffda - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x4, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 4, 1 goto TripleAxelEnd TripleAxelTurn1: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x8, 0x8, 0x14, 0x1, 0x2 @@ -14941,7 +14941,7 @@ TripleAxelTurn1: createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x8, 0x8, 0xff00, 0xffd8 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x8, 0x8, 0x1a0, 0xffda createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x8, 0x8, 0xfe80, 0xffe1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 goto TripleAxelEnd TripleAxelTurn2: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x14, 0x1, 0x2 @@ -14952,7 +14952,7 @@ TripleAxelTurn2: createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x0, 0x0, 0x1a0, 0xffda createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x0, 0x0, 0xff80, 0xffea createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x0, 0x0, 0xfe80, 0xffe1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x6, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 TripleAxelEnd: delay 4 playsewithpan SE_M_ICY_WIND, 0x3f @@ -14966,7 +14966,7 @@ Move_DUAL_WINGBEAT:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_WHITE_FEATHER setalpha 12, 8 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 10, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 10, 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET jumpifmoveturn 1, DualWingbeatRightSide DualWingbeatLeftSide: @@ -15033,7 +15033,7 @@ Move_SCORCHING_SANDS:: call SandAttackDirt call SandAttackDirt call SandAttackDirt - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x2, 0x0, 25, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 2, 0, 25, 1 call SandAttackDirt call SandAttackDirt playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET @@ -15142,7 +15142,7 @@ Move_WICKED_BLOW:: createsprite gSpriteTemplate_WickedBlowRedStars, ANIM_TARGET, 2, 0xfff0, 0xfff8, 0x80, 0xfff0 createsprite gSpriteTemplate_WickedBlowBlackStars, ANIM_TARGET, 2, 0xfff0, 0xfff8, 0xa0, 0xffe0 createsprite gSpriteTemplate_WickedBlowRedStars, ANIM_TARGET, 2, 0xfff0, 0xfff8, 0x1a0, 0xffda - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0xA, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 10, 1 delay 20 createvisualtask AnimTask_TwinkleTackleLaunch, 0x2, 50 delay 50 @@ -15236,7 +15236,7 @@ Move_THUNDER_CAGE:: createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 0 delay 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 16 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x3, 0x0, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 call ThunderCageBolts delay 0x4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, -16 @@ -15273,8 +15273,8 @@ Move_DRAGON_ENERGY:: playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_TARGET call DragonEnergyShot call DragonEnergyShot - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x5E, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_DEF_PARTNER, 0x4, 0x0, 0x5E, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 94, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_DEF_PARTNER, 4, 0, 94, 1 call DragonEnergyShot call DragonEnergyShot call DragonEnergyShot @@ -15329,7 +15329,7 @@ Move_FREEZING_GLARE:: playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xC, 0x7f4c @;Ice blue - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x4, 0x1C, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 28, 1 call IceCrystalEffectShort waitforvisualfinish call UnsetPsychicBg @@ -15343,7 +15343,7 @@ Move_FIERY_WRATH:: playsewithpan SE_M_SACRED_FIRE2, 0xc0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x2, 0x0, 0xE, 0x0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x4, 0x0, 0x8, 0x1F - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 32, 1 call DragonClawFireSpiral call DragonClawFireSpiral waitforvisualfinish @@ -15426,7 +15426,7 @@ Move_THUNDEROUS_KICK:: playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x32 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x7fff - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x2, 0x0, 0x16, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 2, 0, 22, 1 call ZingZapSparks1 delay 0xA call ZingZapSparks2 @@ -15465,8 +15465,8 @@ Move_GLACIAL_LANCE:: playsewithpan SE_M_DETECT, SOUND_PAN_TARGET delay 38 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x6, 0x0, 0x34, 0x1 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_DEF_PARTNER, 0x6, 0x0, 0x34, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 52, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_DEF_PARTNER, 6, 0, 52, 1 delay 4 call IceCrystalEffectLong waitforvisualfinish @@ -15598,7 +15598,7 @@ Move_STONE_AXE:: playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSpriteTemplate_StoneAxeSlash, ANIM_TARGET, 2, 50, -10, 100, 8, 1 @;Move left delay 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0x10, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 16, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET call StoneAxeRockFragments delay 0x8 @@ -15624,7 +15624,7 @@ Move_SPRINGTIDE_STORM:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_RED_HEART playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0x58, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x6, 0x0, 0xB, 0x7ADF call HurricaneGust call SpringtideStormHeartSwirl @@ -15739,7 +15739,7 @@ Move_WAVE_CRASH:: createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 48, 8, 56, 6 call WaterfallBubblesOnAttacker waitforvisualfinish - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x5, 0x5, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 5, 1 call RisingWaterHitEffect waitforvisualfinish delay 0x5 @@ -15771,13 +15771,13 @@ Move_CHLOROBLAST:: waitbgfadeout createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x10, 0x0, 0x0 delay 0x10 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x0, 0x4, 0x4A, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 74, 1 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xFF00 | SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x1, 0x17, 0x0, 0x5 createvisualtask AnimTask_HorizontalShake, 0x5, 5, 1, 67 call ChloroblastShot call ChloroblastShot call ChloroblastShot - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x4, 0x0, 0x4A, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 74, 1 call ChloroblastShot call ChloroblastShot call ChloroblastShot @@ -15821,7 +15821,7 @@ Move_MOUNTAIN_GALE:: call MountainGaleIceRock delay 0x6 call MountainGaleIceRock - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0x18, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 24, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 0x6 call MountainGaleIceRock @@ -15874,7 +15874,7 @@ Move_HEADLONG_RUSH:: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0xF000, 0x0, 0x0, 0xffff waitbgfadein - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x26, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 38, 1 call PulverizingPancakeDiggingRun call PulverizingPancakeDiggingRun call PulverizingPancakeDiggingRun @@ -15961,7 +15961,7 @@ Move_BARB_BARRAGE:: loopsewithpan SE_M_DIG, SOUND_PAN_ATTACKER, 0x7, 0x3 createvisualtask AnimTask_FlailMovement, 0x2, ANIM_ATTACKER delay 0x14 - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x7, 0x0, 0x20, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 32, 1 call PoisonBubblesEffect clearmonbg ANIM_TARGET end @@ -16081,7 +16081,7 @@ Move_TRIPLE_ARROWS:: createsprite gSpriteTemplate_TripleArrowKick, ANIM_TARGET, 2, -30, -20, 0x10, -20 waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x6, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 6, 1 delay 0x4 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, -40, 0, 0, 0, TRIPLE_ARROW_FLY_TIME @@ -16120,7 +16120,7 @@ Move_INFERNAL_PARADE:: delay 0x3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right delay 0x3 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x3, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 call InfernalFlames call InfernalFlames call InfernalFlames @@ -16194,7 +16194,7 @@ Move_BLEAKWIND_STORM:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_ICE_CRYSTALS playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0x58, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x7FFF call HurricaneGust call BleakwindStormIceSwirl @@ -16237,7 +16237,7 @@ Move_WILDBOLT_STORM:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0xff00, 0x0, 0x1, 0xffff waitbgfadein playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0x58, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x07FE call HurricaneGust call WildboltStormSparkSwirl @@ -16279,7 +16279,7 @@ Move_SANDSEAR_STORM:: loadspritegfx ANIM_TAG_SMALL_EMBER createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_GUST, 0x0, 0xA, 0xA, 0x190B playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x0, 0x4, 0x58, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x1F call HurricaneGust call SandsearStormFireSpin @@ -26524,7 +26524,7 @@ Status_Infestation: monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7320 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 30, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 30, 1 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0x0, 30 call InfestationVortex call InfestationVortex @@ -27216,7 +27216,7 @@ Move_ALL_OUT_PUMMELING: waitbgfadein setalpha 12, 8 monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x2, SOUND_PAN_TARGET, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 63, 1 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_1, 0x1 delay 0x2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 @@ -27377,7 +27377,7 @@ FinishAcidDownpour: setalpha 12, 8 monbg ANIM_ATTACKER loopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 0xd, 0x6 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 50, 1 call AcidDownpourFlareOnAttacker call AcidDownpourFlareOnAttacker call AcidDownpourFlareOnAttacker @@ -27398,7 +27398,7 @@ FinishAcidDownpour: panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_CreateSurfWave, 0x2, ANIM_SURF_PAL_SLUDGE_WAVE createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0xd87c - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x2, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call AcidDownpourFlare call AcidDownpourFlare delay 0x15 @@ -27734,7 +27734,7 @@ Move_SAVAGE_SPIN_OUT:: waitforvisualfinish unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT call gSavageSpinOutStringBlastSpriteTemplateSHOT - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x5, 0x0, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 50, 1 call gSavageSpinOutStringBlastSpriteTemplateSHOT call gSavageSpinOutStringBlastSpriteTemplateSHOT call gSavageSpinOutStringBlastSpriteTemplateSHOT @@ -27896,7 +27896,7 @@ Move_NEVER_ENDING_NIGHTMARE:: waitforvisualfinish fadetobg BG_NEVERENDING_NIGHTMARE waitbgfadein - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x4, 0x78, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 120, 1 playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET call NeverendingNightmareHands call NeverendingNightmareHands @@ -28059,7 +28059,7 @@ Move_CORKSCREW_CRASH:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0x6318 @fade atker to gray createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SPIKES, 0x0, 0xC, 0xC, 0x6318 @;Gray playsewithpan SE_ESCALATOR, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x4f, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 79, 1 createsprite gCorkscrewCrashChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 call CorkscrewCrashMetalFlare call CorkscrewCrashMetalFlare @@ -28193,7 +28193,7 @@ FinishInfernoOverdrive: monbg ANIM_ATTACKER setalpha 12, 8 loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_ATTACKER, 0x13, 0x8 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x4f, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 79, 1 createsprite gInfernoOverdriveChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 call InfernoOverdriveFireSpin call InfernoOverdriveFireSpin @@ -28215,7 +28215,7 @@ FinishInfernoOverdrive: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_TARGET, 0x0, 0x2, 0x4f, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 79, 1 call InfernoOverdriveExplosion delay 0x6 call InfernoOverdriveExplosion @@ -28466,7 +28466,7 @@ Move_BLOOM_DOOM:: createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x10, 0x18, 0x0, 0x2, 0x1, 0x0, 0x0 delay 0x5 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 - createvisualtask AnimTask_ShakeMon, 0x2, 0x0, 0x0, 0x4, 0x32, 0x1 @ shake attacker + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 @ shake attacker call BloomDoomHyperBeam call BloomDoomHyperBeam call BloomDoomHyperBeam @@ -28807,7 +28807,7 @@ Move_SHATTERED_PSYCHE:: createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x5, 0x0, 0x0, 0x10, 0x0, 0x0 delay 0x7 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x3, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffc, 0xfffc, 0xf, 0x1, 0x1 waitforvisualfinish ShatteredPsycheCheckBattler: @@ -28826,7 +28826,7 @@ ShatteredPsycheFinish: delay 0x8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET restorebg - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0xf, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffc, 0xfffc, 0xf, 0x1, 0x1 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x0 @ -8, -12 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x0 @@ -29888,7 +29888,7 @@ Move_10000000_VOLT_THUNDERBOLT:: loadspritegfx ANIM_TAG_LEAF @green loadspritegfx ANIM_TAG_POISON_BUBBLE @purple loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER, 0x5, 0xA - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_ATTACKER, 0x0, 0x4, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 @ createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, ANIM_TAG_ORBS, 0x1, 0xc, 0x1f, 0x10, 0x0, 0x0 call TenMillionVoltThunderboltBeamRed call TenMillionVoltThunderboltBeamBlue @@ -30329,7 +30329,7 @@ PulverizingPancakeFinish: waitforvisualfinish fadetobg BG_SOLAR_BEAM_OPPONENT waitbgfadeout - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 50, 1 call PulverizingPancakeDiggingRun call PulverizingPancakeDiggingRun call PulverizingPancakeDiggingRun @@ -31068,7 +31068,7 @@ Move_OCEANIC_OPERETTA:: invisible ANIM_ATTACKER createsprite gOceanOperaBlueChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @charge delay 0x2 - createvisualtask AnimTask_ShakeMon, 0x5, ANIM_ATTACKER, 0x0, 0x2, 0x50, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 80, 1 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 delay 0x2 @@ -31271,7 +31271,7 @@ SplinteredStormshardsByPlayer: delay 0x2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x4, 0x60, 0x1 @shake target up and down + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 96, 1 @shake target up and down createsprite gSplinteredShardsSplinterOpponentSteepSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 delay 0x4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET @@ -31354,7 +31354,7 @@ SplinteredStormshardsByOpponent: delay 0x2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x4, 0x60, 0x1 @shake target up and down + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 96, 1 @shake target up and down createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 delay 0x4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET @@ -31523,7 +31523,7 @@ Move_LETS_SNUGGLE_FOREVER:: createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 delay 0x10 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x2, 0x32, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call LetsSnuggleForeverTears delay 0x8 call LetsSnuggleForeverTears @@ -32610,7 +32610,7 @@ Move_SOUL_STEALING_7_STAR_STRIKE:: waitforvisualfinish unloadspritegfx ANIM_TAG_FIRE_PLUME loadspritegfx ANIM_TAG_PAIN_SPLIT @pain split - createvisualtask AnimTask_ShakeMon, 0x5, 0x1, 0x0, 0x4, 0x25, 0x1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 37, 1 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x14, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 delay 0x4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, ANIM_TARGET, 0x2, 0x0, 0x0, 0x30 @@ -32663,7 +32663,7 @@ Move_SOUL_STEALING_7_STAR_STRIKE:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x0, 0x10, 0x0000 delay 0x1 createsprite gSoulStealZStarSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x24 - createvisualtask AnimTask_ShakeMon, 0x2, ANIM_TARGET, 0x3, 0x0, 0x6, 0x1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0x0 createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0x2a createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0x54 From 323b7716308b44a7c9a098918118547fb51185ea Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 09:55:45 -0400 Subject: [PATCH 096/111] Cleaned: createvisualtask AnimTask_ScaleMonAndRestore & AnimTask_RotateMonSpriteToSide --- data/battle_anim_scripts.s | 52 +++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8b3ae78e0..474240803 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1084,13 +1084,13 @@ Move_GYRO_BALL: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 waitforvisualfinish - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 0, 0 - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 1, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 0, 1 - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 1, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 @@ -1760,14 +1760,14 @@ Move_LAST_RESORT: createsprite gBasicHitSplatSpriteTemplate, 132, 4, -10, 0, 1, 0 createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 1, -32, 0, 0, 3 waitforvisualfinish - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 0, 0 - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 1, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 0, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_PLAYER_RIGHT, 1, 4, 0, 12, 1 createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 2, 16, 0, RGB(31, 31, 31) waitforvisualfinish - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 0, 1 - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 1, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, ANIM_TARGET, 1 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 0, 5 delay 3 @@ -1797,7 +1797,7 @@ Move_SUCKER_PUNCH: createsprite gSuckerPunchSpriteTemplate, 130, 6, -18, 5, 40, 8, 160, 0 delay 4 createsprite gBasicHitSplatSpriteTemplate, 130, 4, -8, 8, 1, 2 - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 6, 384, 1, 2 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 6, 384, ANIM_TARGET, 2 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 1, 4 @@ -3232,7 +3232,7 @@ Move_TRICK_ROOM:: InitRoomAnimation: setalpha 8, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET - createvisualtask AnimTask_ScaleMonAndRestore, 5, 0xfffa, 0xfffa, 15, 1, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1 return Move_DRACO_METEOR: @@ -3814,7 +3814,7 @@ Move_GRASS_KNOT: createsprite gGrassKnotSpriteTemplate, 130, 6, -18, 19, 40, 8, 160, 0 delay 4 createsprite gBasicHitSplatSpriteTemplate, 130, 4, -8, 8, 1, 2 - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 6, 384, 1, 2 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 6, 384, ANIM_TARGET, 2 playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 1, 4 @@ -4932,7 +4932,7 @@ Move_STORM_THROW: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET delay 1 - createvisualtask AnimTask_RotateMonSpriteToSide, 2, 10, 0xC00, 1, 2 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 10, 3072, ANIM_TARGET, 2 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 @@ -5826,7 +5826,7 @@ Move_FINAL_GAMBIT: delay 0x4 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 - createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffc, 0xfffc, 0xf, 0x1, 0x1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 waitforvisualfinish monbg ANIM_TARGET delay 0x1 @@ -9663,7 +9663,7 @@ Move_BABY_DOLL_EYES:: createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x1, 0x0 delay 0x20 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffb, 0xfffb, 0xa, 0x0, 0x1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 waitforvisualfinish delay 0xa createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 @@ -13464,7 +13464,7 @@ Move_MAGIC_POWDER:: createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0x5, 0xffea, 0x75, 0x50, 0x5, 0x1 waitforvisualfinish playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET - createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffa, 0xfffa, 0xf, 0x1, 0x1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1 waitforvisualfinish end @@ -13885,7 +13885,7 @@ Move_OVERDRIVE:: OverdriveRings: playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x8, 0x0, 0x3ff - createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffb, 0xfffb, 0x5, 0x0, 0x0 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 5, ANIM_ATTACKER, 0 createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1 @@ -27175,12 +27175,12 @@ Move_BREAKNECK_BLITZ:: createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x19, 0xffe7, 0x1, 0x1 @ +25, -25 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe6, 0x10, 0x1, 0x4 waitforvisualfinish - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x8, 0xfe00, 0x1, 0x0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -512, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish delay 0x4 - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x8, 0xfe00, 0x1, 0x1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -512, ANIM_TARGET, 1 delay 0xa delay 0x19 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 @@ -28808,7 +28808,7 @@ Move_SHATTERED_PSYCHE:: delay 0x7 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 - createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffc, 0xfffc, 0xf, 0x1, 0x1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 waitforvisualfinish ShatteredPsycheCheckBattler: createvisualtask AnimTask_IsTargetPlayerSide, 0x2 @@ -28827,7 +28827,7 @@ ShatteredPsycheFinish: playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET restorebg createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 - createvisualtask AnimTask_ScaleMonAndRestore, 0x5, 0xfffc, 0xfffc, 0xf, 0x1, 0x1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x0 @ -8, -12 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x0 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x2, 0x0, 0x0 @@ -29362,7 +29362,7 @@ Move_BLACK_HOLE_ECLIPSE:: delay 0x2 visible ANIM_TARGET loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x5 - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x50, 0xfc00, ANIM_TARGET, 0x0 @ spin target around (0x50 (time), -0x400 (rot speed)) + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin target around (0x50 (time), -0x400 (rot speed)) createsprite gBlackHoleEclipseBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 delay 0x8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 @@ -29400,7 +29400,7 @@ Move_BLACK_HOLE_ECLIPSE:: waitforvisualfinish delay 0x18 invisible ANIM_TARGET - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x1, 0x0, ANIM_TARGET, 0x1 @ fix rotation + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 1, 0, ANIM_TARGET, 1 @ fix rotation invisible ANIM_TARGET delay 0x1 waitforvisualfinish @@ -32022,7 +32022,7 @@ Move_SEARING_SUNRAZE_SMASH:: delay 0x2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x50, 0xfc00, ANIM_TARGET, 0x0 @ spin up target + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin up target call SearingSunrazeSmashRingsInward createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) call SearingSunrazeSmashRingsInward @@ -32043,7 +32043,7 @@ Move_SEARING_SUNRAZE_SMASH:: fadetobg BG_COSMIC waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0xf700, 0x0, 0x1, 0xffff - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x1, 0x0, ANIM_TARGET, 0x1 @ fix tgt rotation + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 1, 0, ANIM_TARGET, 1 @ fix tgt rotation invisible ANIM_TARGET waitbgfadein visible ANIM_ATTACKER @@ -32251,7 +32251,7 @@ Move_MENACING_MOONRAZE_MAELSTROM:: delay 0x2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x50, 0xfc00, ANIM_TARGET, 0x0 @ spin up target + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin up target call MenacingMoonrazeMaelstromRingsInward createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) call MenacingMoonrazeMaelstromRingsInward @@ -32279,7 +32279,7 @@ MenacingMoonrazeMaelstromOnOpponent: MenacingMoonrazeMaelstromOnPlayer: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x200, 0xfd00, 0x1, 0xffff MenacingMoonrazeMaelstromFinish: - createvisualtask AnimTask_RotateMonSpriteToSide, 0x2, 0x1, 0x0, ANIM_TARGET, 0x1 @ fix tgt rotation + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 1, 0, ANIM_TARGET, 1 @ fix tgt rotation invisible ANIM_TARGET waitbgfadein visible ANIM_ATTACKER From 5fc5e5703cb967b74ed3a69637eb05a76baef02f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 10:00:39 -0400 Subject: [PATCH 097/111] Cleaned: createvisualtask AnimTask_RockMonBackAndForth & AnimTask_PositionFissureBgOnBattler --- data/battle_anim_scripts.s | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 474240803..583899653 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3777,7 +3777,7 @@ Move_STONE_EDGE: Move_CAPTIVATE: loadspritegfx ANIM_TAG_MAGENTA_HEART loadspritegfx ANIM_TAG_SPARKLE_2 - createvisualtask AnimTask_RockMonBackAndForth, 5, 3, 0, 2, 0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_DEF_PARTNER, 0, 2, 0 createsprite gMagentaHeartSpriteTemplate, 3, 2, 0, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER delay 15 @@ -4694,7 +4694,7 @@ Move_WIDE_GUARD: loadspritegfx ANIM_TAG_WATER_ORB @blue color monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x3, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 3, 0 waitplaysewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 0x10 createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xffe8, 0xffe8 delay 3 @@ -6460,7 +6460,7 @@ Move_DRILL_RUN: setalpha 12, 8 fadetobg BG_FISSURE waitbgfadeout - createvisualtask AnimTask_PositionFissureBgOnBattler, 0x5, 0x1, 0x5, 0xffff + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9679,7 +9679,7 @@ Move_NUZZLE:: loadspritegfx ANIM_TAG_ITEM_BAG loadspritegfx ANIM_TAG_SPARK_2 loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER delay 0xf @@ -10045,7 +10045,7 @@ Move_LANDS_WRATH:: playsewithpan SE_M_EARTHQUAKE, 0x0 createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x32 createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x32 - createvisualtask AnimTask_PositionFissureBgOnBattler, 0x5, 0x1, 0x5, 0xffff + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 waitbgfadein waitforvisualfinish call UnsetPsychicBg @@ -10210,7 +10210,7 @@ Move_PRECIPICE_BLADES:: setalpha 12, 8 fadetobg 0x15 waitbgfadeout - createvisualtask AnimTask_PositionFissureBgOnBattler, 0x5, 0x1, 0x5, 0xffff + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x5 createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x5 playsewithpan SE_M_EARTHQUAKE, 0x0 @@ -11077,7 +11077,7 @@ PollenPuffOpponent: setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x0 waitforvisualfinish - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER delay 0xD @@ -11133,7 +11133,7 @@ PollenPuffAlly: setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x0 waitforvisualfinish - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER delay 0xD @@ -11545,7 +11545,7 @@ Move_REVELATION_DANCE:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x0 waitforvisualfinish playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gRevelationDanceYellowOrbsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x8, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x8, 0x64 @@ -11561,7 +11561,7 @@ Move_REVELATION_DANCE:: createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x0, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x0, 0x64 delay 0x1e - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff0, 0xe, 0x50 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xffec, 0xfff2, 0x10, 0x50 waitforvisualfinish @@ -13629,7 +13629,7 @@ Move_CLANGOROUS_SOUL:: loadspritegfx ANIM_TAG_POISON_BUBBLE @purple loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/grey loadspritegfx ANIM_TAG_SPARKLE_2 @stars - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 call ClangorousSoulStarBuffEffect call ClangorousSoulStarBuffEffect call ClangorousSoulStarBuffEffect @@ -31489,7 +31489,7 @@ Move_LETS_SNUGGLE_FOREVER:: loadspritegfx ANIM_TAG_VERTICAL_HEX @red createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gSnuggleForeverHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x1, 0x0 @@ -31618,7 +31618,7 @@ Move_CLANGOROUS_SOULBLAZE:: loadspritegfx ANIM_TAG_SPARKLE_2 @stars fadetobg BG_CLANGOROUS_SOULBLAZE waitbgfadein - createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x2, 0x0 + createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 call ClangorousSoulblazeBuffEffect call ClangorousSoulblazeBuffEffect call ClangorousSoulblazeBuffEffect @@ -31937,7 +31937,7 @@ Move_GUARDIAN_OF_ALOLA:: fadetobg BG_FISSURE waitbgfadeout call GuardianOfAlolaRocksPlayer - createvisualtask AnimTask_PositionFissureBgOnBattler, 0x5, 0x1, 0x5, 0xffff + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 waitbgfadein playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gGuardianOfAlolaFistSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffd0, 0x1f From eef07a9f9fbc1efcd41f172d1525235c3e09d298 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 10:14:39 -0400 Subject: [PATCH 098/111] Cleaned: createvisualtask AnimTask_HorizontalShake --- data/battle_anim_scripts.s | 112 ++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 583899653..eb0a0ac58 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2563,8 +2563,8 @@ Move_BRAVE_BIRD: Move_EARTH_POWER: loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_FIRE_PLUME - createvisualtask AnimTask_HorizontalShake, 3, 5, 10, 50 - createvisualtask AnimTask_HorizontalShake, 3, 1, 10, 50 + createvisualtask AnimTask_HorizontalShake, 3, ANIM_PLAYER_RIGHT, 10, 50 + createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50 playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET delay 40 loopsewithpan 145, SOUND_PAN_TARGET 11, 3 @@ -3124,7 +3124,7 @@ Move_MIRROR_SHOT: createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 10, 0, RGB_WHITEALPHA - createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -7694,7 +7694,7 @@ Move_FREEZE_SHOCK:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @Electric Circle choosetwoturnanim FreezeShockCharge FreezeShockAttack FreezeShockCharge: - createvisualtask AnimTask_HorizontalShake, 0x5, 0x0, 0x2, 0x10 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff createsprite gFreezeShockCircleTemplate, ANIM_ATTACKER, 2 @electric circle @@ -7741,7 +7741,7 @@ IceBurnCharge: waitforvisualfinish loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0x4, 0x3 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x8, 0x0, 0x0 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x0, 0x2, 0x10 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff delay 0x14 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff @@ -8005,7 +8005,7 @@ Move_FUSION_FLARE:: createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0xc8, 0x50, 0x8, 0x1, 0x28, 0x14, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x50, 0x3c, 0xa, 0x3, 0x14, 0x32, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x8c, 0x64, 0x10, 0x1, 0x14, 0x1e, 0x1 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x1, 0x2, 0x10 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 16 delay 0x5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9842,8 +9842,8 @@ Move_THOUSAND_ARROWS:: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish delay 0x30 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x32 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x32 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 10, 0x32 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 10, 0x32 call ThousandArrowsDown call ThousandArrowsDown call ThousandArrowsDown @@ -10043,8 +10043,8 @@ Move_LANDS_WRATH:: fadetobg BG_FISSURE waitbgfadeout playsewithpan SE_M_EARTHQUAKE, 0x0 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x32 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x32 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 10, 0x32 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 10, 0x32 createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 waitbgfadein waitforvisualfinish @@ -10211,8 +10211,8 @@ Move_PRECIPICE_BLADES:: fadetobg 0x15 waitbgfadeout createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x5 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x5 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 10, 0x5 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 10, 0x5 playsewithpan SE_M_EARTHQUAKE, 0x0 createvisualtask AnimTask_IsTargetPlayerSide, 0x2 jumpargeq 0x7, ANIM_TARGET, PrecipiceBladesOpponent @@ -12325,8 +12325,8 @@ Move_STOMPING_TANTRUM:: monbg ANIM_TARGET createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 delay 0x5 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x5 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x5 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 10, 0x5 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 10, 0x5 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 @@ -12461,8 +12461,8 @@ Move_PRISMATIC_LASER:: unloadspritegfx ANIM_TAG_ICE_CHUNK unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT delay 0x1E - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0xa, 0x32 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0xa, 0x32 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 10, 0x32 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 10, 0x32 playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER call PrismaticLaserRain call PrismaticLaserRain @@ -12674,7 +12674,7 @@ Move_SUNSTEEL_STRIKE:: setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0x1, 0x1A + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 1, 26 delay 0x18 createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 @The rock particles mess up the fly animation createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 @@ -15773,7 +15773,7 @@ Move_CHLOROBLAST:: delay 0x10 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 74, 1 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xFF00 | SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x1, 0x17, 0x0, 0x5 - createvisualtask AnimTask_HorizontalShake, 0x5, 5, 1, 67 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 1, 67 call ChloroblastShot call ChloroblastShot call ChloroblastShot @@ -18611,8 +18611,8 @@ Move_LOW_KICK: end Move_EARTHQUAKE: - createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 50 - createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 50 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 10, 50 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 10, 50 playsewithpan SE_M_EARTHQUAKE, 0 delay 10 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 @@ -18622,7 +18622,7 @@ Move_EARTHQUAKE: Move_FISSURE: loadspritegfx ANIM_TAG_MUD_SAND - createvisualtask AnimTask_HorizontalShake, 3, (MAX_BATTLERS_COUNT + 1), 10, 50 + createvisualtask AnimTask_HorizontalShake, 3, ANIM_PLAYER_RIGHT, 10, 50 createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50 playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET delay 8 @@ -19345,13 +19345,13 @@ Move_MAGNITUDE: MagnitudeEnd: end MagnitudeRegular: - createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 0, 50 - createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 0, 50 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 0, 50 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10 goto MagnitudeEnd MagnitudeIntense: - createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 0, 50 - createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 0, 50 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 0, 50 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10 delay 10 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 @@ -19824,8 +19824,8 @@ Move_ERUPTION: createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 110, -32, 64, 50, 0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 60, -32, 80, 70, 1 delay 22 - createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 8, 60 - createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 8, 60 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 8, 60 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 8, 60 loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 16, 12 delay 80 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 40, F_PAL_BG | F_PAL_BATTLERS, 4, 4, 0, RGB_RED @@ -19855,7 +19855,7 @@ Move_IMPRISON: waitforvisualfinish delay 4 createsprite gRedXSpriteTemplate, ANIM_ATTACKER, 5, ANIM_ATTACKER, 40 - createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 1, 10 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 1, 10 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBg @@ -26818,7 +26818,7 @@ General_MegaEvolution: waitforvisualfinish createvisualtask AnimTask_TransformMon, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA - createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish createvisualtask SoundTask_PlayNormalCry, 0 createsprite gMegaSymbolSpriteTemplate ANIM_ATTACKER, 2 @@ -26964,7 +26964,7 @@ General_PrimalReversion_Alpha: waitforvisualfinish createvisualtask AnimTask_TransformMon, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA - createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish createvisualtask SoundTask_PlayNormalCry, 0 createsprite gAlphaSymbolSpriteTemplate ANIM_ATTACKER, 2 @@ -26991,7 +26991,7 @@ General_PrimalReversion_Omega: waitforvisualfinish createvisualtask AnimTask_TransformMon, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA - createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish createvisualtask SoundTask_PlayNormalCry, 0 createsprite gOmegaSymbolSpriteTemplate ANIM_ATTACKER, 2 @@ -27122,8 +27122,8 @@ Move_BREAKNECK_BLITZ:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_METEOR loadspritegfx ANIM_TAG_FLAT_ROCK - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0x5, 0x20 @ shake screen - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0x5, 0x20 @ shake banks + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 5, 32 @ shake screen + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 5, 32 @ shake banks playsewithpan SE_M_EARTHQUAKE, 0x0 monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER @@ -27296,7 +27296,7 @@ Move_SUPERSONIC_SKYSTRIKE: waitforvisualfinish monbg ANIM_DEF_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x8, 0x0, 0x0 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x0, 0x2, 0x10 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff clearmonbg ANIM_DEF_PARTNER @@ -27501,8 +27501,8 @@ Move_TECTONIC_RAGE: createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x6e, 0xffe0, 0x40, 0x32, 0x0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xffe0, 0x50, 0x46, 0x1 delay 0x16 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0x8, 0x3c - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0x8, 0x3c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 8, 60 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 8, 60 loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 0x10, 0xc delay 0x30 call TectonicRageExplosion @@ -27635,8 +27635,8 @@ FinishContinentalCrush: createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x6e, 0xffe0, 0x40, 0x32, 0x0 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xffe0, 0x50, 0x46, 0x1 delay 0x16 - createvisualtask AnimTask_HorizontalShake, 0x5, 0x5, 0x8, 0x1c - createvisualtask AnimTask_HorizontalShake, 0x5, 0x4, 0x8, 0x1c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 8, 28 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 8, 28 unloadspritegfx ANIM_TAG_ROUND_SHADOW @ fly unloadspritegfx ANIM_TAG_MUD_SAND @ dig unloadspritegfx ANIM_TAG_FOCUS_ENERGY @ focus energy @@ -28110,7 +28110,7 @@ FinishCorkscrewCrash: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffc0, 0x0f delay 0xf - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x2, 0x30 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 48 createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfffe, 0x03 call CorkscrewCrashSpinningWind call CorkscrewCrashSprayRocks @@ -28336,7 +28336,7 @@ Move_HYDRO_VORTEX:: playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x10, 0x5da0 loadspritegfx ANIM_TAG_GUST - createvisualtask AnimTask_HorizontalShake, 0x5, 0x1, 0x8, 0x3c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 60 call HydroVortexWhirlpoolHurricane call HydroVortexWhirlpoolHurricane call HydroVortexWhirlpoolHurricane @@ -28698,7 +28698,7 @@ Move_GIGAVOLT_HAVOC:: createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 delay 0xe clearmonbg ANIM_ATTACKER - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x8, 0x1c @shake target + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 28 @shake target unloadspritegfx ANIM_TAG_HAVOC_SPEAR loadspritegfx ANIM_TAG_SHOCK_3 @thunderbolt createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 0x2c, 0x0, 0x0, 0x3 @@ -29013,7 +29013,7 @@ SubzeroSlammerFinish: createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x0 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x2, 0x0, 0x0 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x3, 0x0, 0x0 - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x8, 0x1c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 28 call SubzeroSlammerExplosion call SubzeroSlammerExplosion clearmonbg ANIM_DEF_PARTNER @@ -29143,7 +29143,7 @@ DevastatingDrakeFinish: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER loadspritegfx ANIM_TAG_EXPLOSION createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION, 0x0, 0xC, 0xC, 0x502B - createvisualtask AnimTask_HorizontalShake, 0x5, 0x1, 0x5, 0x35 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 53 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x10, 0x40c0 @ fade to purple call DevastatingDrakeExplosion delay 0x6 @@ -29162,7 +29162,7 @@ DevastatingDrakeUniversalEnding: createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FIRE_PLUME, 0x0, 0xC, 0xC, 0x502B createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_VERTICAL_HEX, 0x0, 0xC, 0xC, 0x502B createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xC, 0xC, 0x502B - createvisualtask AnimTask_HorizontalShake, 0x5, 0x1, 0x5, 0x20 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 32 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER call DevastatingDrakeGeyser playsewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER @@ -29942,7 +29942,7 @@ Move_10000000_VOLT_THUNDERBOLT:: unloadspritegfx ANIM_TAG_LEAF @green unloadspritegfx ANIM_TAG_POISON_BUBBLE @purple loadspritegfx ANIM_TAG_EXPLOSION @explosion - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x2, 0x2c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 44 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -30113,7 +30113,7 @@ StokedSparksurferFinish: unloadspritegfx ANIM_TAG_FOCUS_ENERGY unloadspritegfx ANIM_TAG_ELECTRIC_ORBS unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x5, 0x1c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 28 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -30379,7 +30379,7 @@ PulverizingPancakeFinish: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x0 @big hit marker delay 0x0 - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x4, 0x2c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 44 createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 delay 0x5 loadspritegfx ANIM_TAG_EXPLOSION @explosion @@ -30686,7 +30686,7 @@ SinisterArrowRaidOnOpponent: createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x08, 0x100, 0xf, 0x15 waitforvisualfinish call SinisterArrowRaidFlyStrike - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x3, 0x4b + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 75 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x40c0 @ defender to purple call SinisterArrowRaidStrikeOpponent call SinisterArrowRaidOpponentExplosion @@ -30738,7 +30738,7 @@ SinisterArrowRaidOnPlayer: createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x88, 0xfff0, 0x38, 0x15 waitforvisualfinish call SinisterArrowRaidFlyStrike - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x3, 0x4b + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 75 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x40c0 @ defender to purple call SinisterArrowRaidArrowsStrikePlayer call SinisterArrowRaidPlayerExplosion @@ -31175,7 +31175,7 @@ Move_OCEANIC_OPERETTA:: loadspritegfx ANIM_TAG_EXPLOSION @explosion loadspritegfx ANIM_TAG_SPARKLE_2 @sparkle loadspritegfx ANIM_TAG_RAIN_DROPS @rain - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x8, 0x40 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 64 call OceanicOperettaExplosion createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x2, 0x0, 0xb, 0x5da0 createvisualtask AnimTask_CreateRaindrops, 0x2, 0x0, 0x3, 0x78 @@ -31673,8 +31673,8 @@ Move_CLANGOROUS_SOULBLAZE:: createsprite gClangoorousSoulblazePulseSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0x0, 0x0, 0x0, 0x1d, 0x0 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 @music note delay 0x5 - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x2, 0x3c - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_DEF_PARTNER, 0x2, 0x3c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 60 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_DEF_PARTNER, 2, 60 call ClangorousSoulblazePulse_1 delay 0x5 call ClangorousSoulblazePulse_2 @@ -31944,7 +31944,7 @@ Move_GUARDIAN_OF_ALOLA:: delay 0x24 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0xb, 0x0, 0x0000 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET - createvisualtask AnimTask_HorizontalShake, 0x3, ANIM_TARGET, 0xa, 0x25 + createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 0x25 loopsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET 0x10 0x9 call GuardianOfAlolaRocksTarget call GuardianOfAlolaRockGeyser @@ -32090,7 +32090,7 @@ SearingSunrazeSmashImpact: delay 0x8 delay 0x1 unloadspritegfx ANIM_TAG_GOLD_RING @beam - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x4, 0x3c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 60 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x20, 0xffe0, 0x0 delay 0x2 @@ -32467,7 +32467,7 @@ Move_LIGHT_THAT_BURNS_THE_SKY:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 delay 0x6 - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x3, 0x3c + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 60 unloadspritegfx ANIM_TAG_LEAF @green unloadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge loadspritegfx ANIM_TAG_FIRE_PLUME @blast burn @@ -32681,7 +32681,7 @@ Move_SOUL_STEALING_7_STAR_STRIKE:: playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gTargetTwinkleSpriteTemplate, ANIM_TARGET, 13, 0x0, 0x0, ANIM_TARGET @detect star delay 0xa - createvisualtask AnimTask_HorizontalShake, 0x5, ANIM_TARGET, 0x8, 0x20 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 32 call SoulStealingSevenStarStrikeExplosion call SoulStealingSevenStarStrikeExplosion createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x2, 0x0, 0x10, 0x0 @everything to black From ac519bd5d3f776ddff4e039d0e01bcc41dc5d61c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 10:54:57 -0400 Subject: [PATCH 099/111] Cleaned: createvisualtask AnimTask_FlailMovement & AnimTask_ElectricChargingParticles --- data/battle_anim_scripts.s | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index eb0a0ac58..33e9d6e47 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3138,7 +3138,7 @@ Move_FLASH_CANNON: loadspritegfx ANIM_TAG_FLASH_CANNON_BALL monbg ANIM_ATTACKER setalpha 13, 8 - createvisualtask AnimTask_ElectricChargingParticles, 2, 0, 60, 2, 12 + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -6265,7 +6265,7 @@ Move_STRUGGLE_BUG: setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, 0x0a1f waitforvisualfinish - createvisualtask AnimTask_FlailMovement, 2, 0 + createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 2 loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 0x8, 0x2 @@ -6876,7 +6876,7 @@ Move_SEARING_SHOT: setalpha 8, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 waitforvisualfinish - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x3c, 0x2, 0xc + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1F playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 0x1e @@ -7563,7 +7563,7 @@ Move_BOLT_STRIKE:: setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x07FE - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x40, 0x0, 0x2 + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 64, 0, 2 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 0xc createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 @@ -10077,7 +10077,7 @@ Move_LIGHT_OF_RUIN:: loadspritegfx ANIM_TAG_EXPLOSION @explosion createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 0xC, 0xC, 0x6DDE @Pink waitforvisualfinish - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x14, 0x0, 0x2 + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 20, 0, 2 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x6B1F createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 @@ -14131,7 +14131,7 @@ Move_METEOR_ASSAULT:: loadspritegfx ANIM_TAG_EXPLOSION createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, 0x0B1D @Light orange createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, 0x0B1D @Light orange - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x30, 0x0, 0x4 + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 48, 0, 4 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish invisible ANIM_ATTACKER @@ -14174,7 +14174,7 @@ Move_STEEL_BEAM:: delay 48 loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_GUST - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x14, 0x0, 0x2 + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 20, 0, 2 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 20 loadspritegfx ANIM_TAG_STEEL_BEAM @@ -14530,7 +14530,7 @@ Move_RISING_VOLTAGE:: ANIM_RISING_VOLTAGE_NORMAL: createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 @;To black waitforvisualfinish - createvisualtask AnimTask_ElectricChargingParticles, 0x2, ANIM_ATTACKER, 30, 0, 3 @;Amount, Slowness, Slowness, Compaction + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 30, 0, 3 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 0xc createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 0, 0x0 @@ -14554,7 +14554,7 @@ ANIM_RISING_VOLTAGE_NORMAL: ANIM_RISING_VOLTAGE_STRONGER: createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @;To black waitforvisualfinish - createvisualtask AnimTask_ElectricChargingParticles, 0x2, ANIM_ATTACKER, 55, 0, 0 @;Amount, Slowness, Slowness, Compaction + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 55, 0, 0 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 0xc createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2, @@ -14736,7 +14736,7 @@ Move_BURNING_JEALOUSY:: waitforvisualfinish monbg ANIM_TARGET playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER - createvisualtask AnimTask_FlailMovement, 0x2, ANIM_ATTACKER + createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER call BurningJealousyFlames delay 0x8 call BurningJealousyFlames @@ -15959,7 +15959,7 @@ Move_BARB_BARRAGE:: monbg ANIM_TARGET call BarbBarrageSpikeShoot loopsewithpan SE_M_DIG, SOUND_PAN_ATTACKER, 0x7, 0x3 - createvisualtask AnimTask_FlailMovement, 0x2, ANIM_ATTACKER + createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER delay 0x14 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 32, 1 call PoisonBubblesEffect @@ -28632,7 +28632,7 @@ Move_GIGAVOLT_HAVOC:: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER monbg ANIM_ATTACKER playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER -@ createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x3c, 0x2, 0xc @charge particles to user +@ createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @charge particles to user @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 @@ -29635,7 +29635,7 @@ CatastropikaFinish: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge loadspritegfx ANIM_TAG_SPARK_2 @spark playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x3c, 0x2, 0xc @charge particles to user + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @charge particles to user createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 @@ -29809,7 +29809,7 @@ Move_10000000_VOLT_THUNDERBOLT:: waitbgfadein visible ANIM_ATTACKER playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x3c, 0x2, 0xc @charge particles to user + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @charge particles to user createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 @@ -30076,7 +30076,7 @@ StokedSparksurferFinish: loadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x1c, 0x2, 0xc + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 28, 2, 12 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 60, 1 call EndureEffect delay 0x8 @@ -32434,7 +32434,7 @@ Move_LIGHT_THAT_BURNS_THE_SKY:: setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 waitforvisualfinish - createvisualtask AnimTask_ElectricChargingParticles, 0x2, 0x0, 0x3c, 0x2, 0xc @ charge particles to attacker + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker delay 0x1e loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 3, 0x0 From 2cf7f54a6b6cb0ee77f8ffc3d149d3b91d75a042 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 11:08:26 -0400 Subject: [PATCH 100/111] Cleaned: 3 more createvisualtask - AnimTask_CanBattlerSwitch - AnimTask_BlendMonInAndOut - AnimTask_CentredFrozenIceCube --- data/battle_anim_scripts.s | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 33e9d6e47..01bd711aa 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -6237,7 +6237,7 @@ Move_VOLT_SWITCH: delay 4 call ElectricityEffect playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createvisualtask AnimTask_CanBattlerSwitch 1, ANIM_ATTACKER + createvisualtask AnimTask_CanBattlerSwitch, 1, ANIM_ATTACKER jumpretfalse VoltSwitchContinue createvisualtask AnimTask_IsTargetSameSide 1 jumprettrue VoltSwitchAgainstPartner @@ -6246,7 +6246,7 @@ VoltSwitchContinue: waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff - createvisualtask AnimTask_CanBattlerSwitch 1, ANIM_ATTACKER + createvisualtask AnimTask_CanBattlerSwitch, 1, ANIM_ATTACKER jumpretfalse VoltSwitchLast invisible ANIM_ATTACKER VoltSwitchLast: @@ -9649,7 +9649,7 @@ Move_HOLD_HANDS:: delay 0x14 playsewithpan SE_M_ENCORE, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 3, 0, 10, 1 - createvisualtask AnimTask_BlendMonInAndOut, 0x2, 0x2, 0x3ff, 0xc, 0x1, 0x1 + createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATK_PARTNER, RGB(31, 31, 0), 12, 1, 1 end Move_BABY_DOLL_EYES:: @@ -11318,7 +11318,7 @@ Move_FIRE_LASH:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x6 delay 0x4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1 - createvisualtask AnimTask_BlendMonInAndOut, 0x3, 0x1, 0x1f, 0xc, 0x1, 0x1 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB(31, 0, 0), 12, 1, 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_SLASH createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 0x1, 0xfff8, 0x0 @@ -11843,14 +11843,14 @@ Move_INSTRUCT:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x8, 0x7DB9 delay 0x4 monbg ANIM_TARGET - createvisualtask AnimTask_BlendMonInAndOut, 0x5, 0x0, 0x37b, 0xc, 0x1, 0x1 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 41, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET delay 0x1A - createvisualtask AnimTask_BlendMonInAndOut, 0x5, 0x0, 0x37b, 0xc, 0x1, 0x1 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET delay 0x1A - createvisualtask AnimTask_BlendMonInAndOut, 0x5, 0x0, 0x37b, 0xc, 0x1, 0x1 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET delay 0x1D createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x7DB9 @@ -14745,8 +14745,8 @@ Move_BURNING_JEALOUSY:: playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 12, 1 - createvisualtask AnimTask_BlendMonInAndOut, 0x3, ANIM_TARGET, 0x1f, 0xc, 0x1, 0x1 - createvisualtask AnimTask_BlendMonInAndOut, 0x3, ANIM_DEF_PARTNER, 0x1f, 0xc, 0x1, 0x1 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB(31, 0, 0), 12, 1, 1 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_DEF_PARTNER, RGB(31, 0, 0), 12, 1, 1 call FireSpreadEffect @ INCINERATE_BURN_CHANCE waitforvisualfinish clearmonbg ANIM_TARGET @@ -15458,7 +15458,7 @@ Move_GLACIAL_LANCE:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xA, 0x3C00 @;Royal Blue monbg ANIM_TARGET playsewithpan SE_M_HAIL, SOUND_PAN_TARGET - createvisualtask AnimTask_CentredFrozenIceCube, ANIM_TARGET, 0x0 + createvisualtask AnimTask_CentredFrozenIceCube, ANIM_TARGET, 0 createsprite gSpriteTemplate_GlacialLance, ANIM_TARGET, 2, 0, 40, 0, 0, 40, 50, 10 delay 60 createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, ANIM_TAG_ICICLE_SPEAR, 0x4, 0x1, 0x7FFF, 0x10, 0x0, 0x0 From d0277fc04f0023318f67b00ba28b4faf8d5f4565 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 14:04:27 -0400 Subject: [PATCH 101/111] Cleaned: createvisualtask AnimTask_BlendColorCycle --- data/battle_anim_scripts.s | 216 ++++++++++++++++++------------------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 01bd711aa..46e0dd8c5 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1017,7 +1017,7 @@ Move_MIRACLE_EYE: createsprite gWhiteHaloSpriteTemplate, ANIM_ATTACKER, 5 delay 40 playsewithpan SE_M_LEER, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, 1, 1, 2, 0, 10, RGB_BLACK + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG, 1, 2, 0, 10, RGB_BLACK call MindReaderEyeSpikeEffect waitforvisualfinish call UnsetPsychicBg @@ -1137,7 +1137,7 @@ Move_NATURAL_GIFT: loadspritegfx ANIM_TAG_HOLLOW_ORB monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, 2, 2, 2, 0, 16, RGB(27, 31, 18) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 16, RGB(27, 31, 18) playsewithpan SE_M_MEGA_KICK, -64 call GrantingStarsEffect waitforvisualfinish @@ -1613,7 +1613,7 @@ Move_COPYCAT: loadspritegfx ANIM_TAG_GRAY_ORB loadspritegfx ANIM_TAG_THIN_RING playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, 2, 8, 1, 0, 12, RGB_WHITE + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 8, 1, 0, 12, RGB_WHITE createvisualtask AnimTask_StockpileDeformMon, 5 call StockpileAbsorb call StockpileAbsorb @@ -1869,7 +1869,7 @@ General_AquaRingHeal: createsprite gGuardRingSpriteTemplate, 2, 0 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, 10, 0, 2, 10, RGB(31, 31, 31) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 0, 2, 10, RGB(31, 31, 31) waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff @@ -1879,7 +1879,7 @@ Move_MAGNET_RISE: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK_2 delay 0 - createvisualtask AnimTask_BlendColorCycle 2, 31, -31, 1, 5, 5, RGB(31, 31, 20) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), -31, 1, 5, 5, RGB(31, 31, 20) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createvisualtask AnimTask_WindUpLunge, 5, ANIM_OPPONENT_RIGHT, 0, -12, 4, 10, 10, 12, 6 createsprite gSparkElectricitySpriteTemplate, 0, 7, 32, 24, 190, 12, 0, 1, 0 @@ -1904,11 +1904,11 @@ Move_MAGNET_RISE: delay 0 createsprite gSparkElectricitySpriteTemplate, 0, 7, 238, 24, 165, 10, 0, 1, 1 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, 31, -31, 1, 0, 0, RGB(31, 31, 20) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), -31, 1, 0, 0, RGB(31, 31, 20) delay 20 - createvisualtask AnimTask_BlendColorCycle, 2, 31, -31, 1, 7, 7, RGB(31, 31, 20) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), -31, 1, 7, 7, RGB(31, 31, 20) waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 2, 31, -31, 1, 0, 0, RGB(31, 31, 20) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), -31, 1, 0, 0, RGB(31, 31, 20) waitforvisualfinish end @@ -2373,7 +2373,7 @@ Move_DRAGON_PULSE: call DragonPulseParticle call DragonPulseParticle createvisualtask AnimTask_SwayMon, 5, 0, 6, 51200, 4, ANIM_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(30, 10, 13) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(30, 10, 13) call DragonPulseParticle call DragonPulseParticle call DragonPulseParticle @@ -2965,7 +2965,7 @@ Move_SHADOW_SNEAK: delay 0x1 createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 delay 0x30 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xF, 0x0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 15, RGB(0, 0, 0) createsprite gShadowSneakImpactSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 call ShadowSneakMovement createsprite gShadowSneakImpactSpriteTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 @@ -3262,16 +3262,16 @@ Move_DISCHARGE: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK_2 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 20) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 20) delay 10 - createvisualtask AnimTask_BlendColorCycle 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 20) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, 0, 1, 1 @@ -3366,7 +3366,7 @@ DischargeElectrify: Move_LAVA_PLUME: loadspritegfx ANIM_TAG_FIRE_PLUME loopsewithpan 152, SOUND_PAN_ATTACKER, 9, 2 - createvisualtask AnimTask_BlendColorCycle, 2, 2, 2, 2, 0, 11, RGB_RED + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 32, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 32, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 1, 0, 32, 1 @@ -4001,25 +4001,25 @@ Move_CHARGE_BEAM: loadspritegfx ANIM_TAG_BLACK_BALL_2 loadspritegfx ANIM_TAG_SPARK_2 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 5, 5, RGB(31, 31, 22) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) delay 10 - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 5, 5, RGB(31, 31, 22) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, 0, 1, 1 delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, 0, 1, 1 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) delay 20 - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 7, 7, RGB(31, 31, 22) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 7, 7, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 @@ -4031,7 +4031,7 @@ Move_CHARGE_BEAM: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 delay 4 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER createsprite gZapCannonBallSpriteTemplate, ANIM_TARGET, 3, 10, 0, 0, 0, 30, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 @@ -4423,13 +4423,13 @@ Move_MAGMA_STORM: loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 5, 8 createvisualtask AnimTask_SeismicTossBgAccelerateDownAtEnd, 3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1 - createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_ATTACKER | F_PAL_TARGET), 4, 2, 2, 0, 12, RGB(22, 9, 7) call FireSpinEffect call FireSpinEffect - createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_ATTACKER | F_PAL_TARGET), 4, 2, 2, 0, 12, RGB(22, 9, 7) call FireSpinEffect call FireSpinEffect - createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_ATTACKER | F_PAL_TARGET), 4, 2, 2, 0, 12, RGB(22, 9, 7) call FireSpinEffect restorebg waitbgfadeout @@ -4649,7 +4649,7 @@ ShadowForceAttack: createvisualtask AnimTask_NightShadeClone, 5, 85 delay 70 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 - createvisualtask AnimTask_BlendColorCycle 2, 4, 0, 2, 0, 13, 0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 0, 2, 0, 13, RGB(0, 0, 0) waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 @@ -4798,7 +4798,7 @@ Move_PSYSHOCK: monbg ANIM_TARGET setalpha 8, 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 2, 0, 8, 767 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(31, 23, 0) waitforvisualfinish loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1 @@ -4870,7 +4870,7 @@ Move_RAGE_POWDER:: call RagePowderSprinkle call RagePowderSprinkle call RagePowderSprinkle - createvisualtask AnimTask_BlendColorCycle, ANIM_ATTACKER, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x1f + createvisualtask AnimTask_BlendColorCycle, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 0, 0) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -5123,7 +5123,7 @@ Move_SOAK: delay 30 playsewithpan SE_M_WATERFALL, 63 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 17, 1 - createvisualtask AnimTask_BlendColorCycle, 2, 4, 1, 2, 0, 12, RGB_BLUE + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB_BLUE createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0 @@ -5212,7 +5212,7 @@ Move_ACID_SPRAY: playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 33 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(30, 0, 31) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(30, 0, 31) playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, 10, 15, 55, FALSE createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, -20, 15, 55, FALSE @@ -5406,7 +5406,7 @@ Move_CLEAR_SMOG: call ClearSmogCloud delay 120 loopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 18, 2 - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB_WHITE + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB_WHITE delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 waitforvisualfinish @@ -5452,7 +5452,7 @@ Move_QUICK_GUARD: loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @hand loadspritegfx ANIM_TAG_SPARKLE_4 @sparkles setalpha 12, 8 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x2, 0x0, 0xa, 0x7FFF + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 10, RGB(31, 31, 31) delay 0x10 monbg ANIM_ATTACKER createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 @@ -5494,7 +5494,7 @@ Move_SCALD: call ScaldBeams call ScaldBeams call ScaldBeams - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_RED + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 call ScaldHitSplats call ScaldBeams @@ -5599,7 +5599,7 @@ Move_HEX: createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 37, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET delay 0x20 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xc, 0x4C4A @;Deep purple + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(10, 2, 19) @;Deep purple createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 4 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5819,7 +5819,7 @@ Move_FINAL_GAMBIT: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x2, 0x0, 0x8, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(31, 31, 31) waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER createsprite gFinalGambitBlueYawnTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x25 @@ -5931,7 +5931,7 @@ Move_WATER_PLEDGE: panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_BLUE + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 11, RGB_BLUE createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 @@ -6044,7 +6044,7 @@ Move_FIRE_PLEDGE: panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_RED + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 @@ -6190,7 +6190,7 @@ GrassPledgeMiddleFountain: playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 0, 0 - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_GREEN + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 11, RGB_GREEN createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 @@ -6375,7 +6375,7 @@ Move_WORK_UP: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -18, 26, 3 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 18, 26, 3 delay 14 - createvisualtask AnimTask_BlendColorCycle, 2, 2, 2, 2, 0, 11, RGB(31, 2, 4) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 2, 4) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -13, 26, 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 13, 26, 2 @@ -6754,7 +6754,7 @@ Move_PSYSTRIKE: monbg ANIM_TARGET setalpha 8, 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 2, 0, 8, RGB_RED + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_RED waitforvisualfinish createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 @@ -7983,7 +7983,7 @@ Move_FUSION_FLARE:: playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call FusionFlareBuff delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x1F + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x1, 0x0 delay 0x8 @@ -7997,7 +7997,7 @@ Move_FUSION_FLARE:: createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x50, 0x3c, 0xa, 0x3, 0x14, 0x32, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x8c, 0x64, 0x10, 0x1, 0x14, 0x1e, 0x1 delay 0x29 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xb, 0x1F + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 11, RGB(31, 0, 0) delay 0x5 createsprite gFusionFlareRedRingTemplate, ANIM_ATTACKER, 3, 0x1, 0x1, 0x1, 0x1, 0x1F, 0x8 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x64, 0x64, 0x8, 0x1, 0x14, 0x28, 0x0 @@ -9159,7 +9159,7 @@ Move_MYSTICAL_FIRE:: setalpha 8, 8 playse 0xb1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x0, 0x2, 0x0, 0x8, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(31, 31, 31) waitforvisualfinish waitsound blendoff @@ -9228,7 +9228,7 @@ Move_AROMATIC_MIST:: call SweetScentEffect createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0x0 setpan SOUND_PAN_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 1, 5, 5, 13, 0x56bf + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 1, 5, 5, 13, RGB(31, 21, 21) call SweetScentEffect waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6E7D @@ -9591,7 +9591,7 @@ Move_DAZZLING_GLEAM:: createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 delay 8 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x0, 0x3, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 3, 0, 16, RGB(31, 31, 31) delay 0x4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9787,7 +9787,7 @@ Move_OBLIVION_WING:: call OblivionWingBeam call OblivionWingBeam createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 40, 1 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x4, 0x0, 0xc, 0x289F @Pinkish Red + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 4, 0, 12, RGB(31, 4, 10) @Pinkish Red call OblivionWingBeam call OblivionWingBeam call OblivionWingBeam @@ -11342,7 +11342,7 @@ Move_POWER_TRIP:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call PowerTripBuffUp delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp delay 0x8 @@ -11863,7 +11863,7 @@ General_BeakBlastSetUp: loadspritegfx ANIM_TAG_SMALL_EMBER @Fire playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER delay 0x3 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x1f + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 0, 0) createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 waitforvisualfinish end @@ -12008,7 +12008,7 @@ Move_AURORA_VEIL:: createsprite gAuroraVeilRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, 0xa, 0x0, 0x2, 0x0, 0xa, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 0, 2, 0, 10, RGB(31, 31, 31) waitforvisualfinish call UnsetPsychicBg waitforvisualfinish @@ -12978,7 +12978,7 @@ Move_MULTI_ATTACK:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MultiAttackBuff delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MultiAttackBuff delay 0x8 @@ -13115,7 +13115,7 @@ Move_PLASMA_FISTS:: end PlasmaFistSpark1: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x2, 0x0, 0xb, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 11, RGB(31, 31, 22) createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 delay 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 @@ -13427,7 +13427,7 @@ Move_TAR_SHOT:: playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 0xf createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0x10, 0x0 @;Black + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 16, RGB(0, 0, 0) @;Black createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 0xa @@ -13507,7 +13507,7 @@ Move_OCTOLOCK:: delay 0x8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 delay 0x14 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0x8, 0x1f + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 8, RGB(31, 0, 0) playsewithpan SE_M_BIND, SOUND_PAN_TARGET setarg 0x7 0xffff waitforvisualfinish @@ -13522,7 +13522,7 @@ Move_BOLT_BEAK:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HORN_HIT, 0, 12, 12, 0x079D @Yellow call BoltBeakSparks waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x3, 0xffe1, 0x1, 0x0, 0x0, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) createsprite gHorizontalLungeSpriteTemplate, 0x2, 0x2, 0x4, 0x4 delay 0x4 createsprite gHornHitSpriteTemplate, 0x84, 0x3, 0x8, 0x8, 0xa @@ -13531,7 +13531,7 @@ Move_BOLT_BEAK:: playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x4, 0xffe1, 0x2, 0x0, 0x6, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, -31, 2, 0, 6, RGB(31, 31, 22) call ElectricityEffect waitforvisualfinish end @@ -13542,18 +13542,18 @@ BoltBeakSparks: createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, 0x0, 0x7, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 delay 0x0 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x3, 0xffe1, 0x1, 0x0, 0x0, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) delay 0xa - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x3, 0xffe1, 0x1, 0x5, 0x5, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, 0x0, 0x7, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 delay 0x0 createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x0 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x3, 0xffe1, 0x1, 0x0, 0x0, 0x76E1 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(1, 23, 29) delay 0x14 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x3, 0xffe1, 0x1, 0x4, 0x4, 0x76E1 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 4, 4, RGB(1, 23, 29) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, 0x4, 0x8, 0x0, 0x0, 0x20, 0xc, 0x0, 0x14, 0x0, 0x0 createsprite gBoltBeakBlueFlashingSparkTemplate, 0x4, 0x8, 0x0, 0x0, 0x20, 0xc, 0x40, 0x14, 0x1, 0x0 @@ -13763,7 +13763,7 @@ Move_PYRO_BALL:: playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gPyroBallEmberBallTemplate, ANIM_ATTACKER, 2, 0, 10, 0, 5, 20, -20 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xc, 0x1f + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 0, 0) createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect delay 0x20 @@ -14236,7 +14236,7 @@ Move_EXPANDING_FORCE:: monbg ANIM_DEF_PARTNER call SetPsychicBackground createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, F_PAL_ATTACKER, 0x2, 0x0, 0x8, 0x2ff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, F_PAL_ATTACKER, 2, 0, 8, RGB(31, 23, 0) waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET choosetwoturnanim EXPANDING_FORCE_SINGLE_TARGET EXPANDING_FORCE_BOTH_TARGETS @@ -14507,7 +14507,7 @@ Move_GRASSY_GLIDE:: loadspritegfx ANIM_TAG_IMPACT @hits loadspritegfx ANIM_TAG_WHIP_HIT createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_IMPACT, 0x0, 0xD, 0xD, 0x0266 @;Leaf Green - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x2, 0x0, 0x8, 0x03AC + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(12, 29, 0) delay 0x2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -120, 0, 0, 10 @;Slide off off, screen @@ -14536,7 +14536,7 @@ ANIM_RISING_VOLTAGE_NORMAL: createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 0, 0x0 waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x34, 0x1, 0x0 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x1, 0x4, 0x0, 0xC, 0x079D + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(29, 28, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 delay 0x1 @@ -14608,7 +14608,7 @@ TerrainPulseNormal: call DragonPulseParticle call DragonPulseParticle createvisualtask AnimTask_SwayMon, 5, 0, 2, 51200, 24, ANIM_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB_WHITE + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB_WHITE goto TerrainPulseEnd TerrainPulseElectric: @@ -14619,7 +14619,7 @@ TerrainPulseElectric: call DragonPulseParticle call DragonPulseParticle createvisualtask AnimTask_SwayMon, 5, 0, 4, 51200, 24, ANIM_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(27, 27, 0) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(27, 27, 0) goto TerrainPulseEnd TerrainPulseGrass: @@ -14630,7 +14630,7 @@ TerrainPulseGrass: call DragonPulseParticle call DragonPulseParticle createvisualtask AnimTask_SwayMon, 5, 0, 4, 51200, 24, ANIM_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(11, 26, 11) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(11, 26, 11) goto TerrainPulseEnd TerrainPulseFairy: @@ -14641,7 +14641,7 @@ TerrainPulseFairy: call DragonPulseParticle call DragonPulseParticle createvisualtask AnimTask_SwayMon, 5, 0, 4, 51200, 24, ANIM_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(31, 24, 31) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 24, 31) goto TerrainPulseEnd TerrainPulsePsychic: @@ -14652,7 +14652,7 @@ TerrainPulsePsychic: call DragonPulseParticle call DragonPulseParticle createvisualtask AnimTask_SwayMon, 5, 0, 4, 51200, 24, ANIM_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(27, 0, 13) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(27, 0, 13) goto TerrainPulseEnd TerrainPulseEnd: @@ -14726,11 +14726,11 @@ Move_BURNING_JEALOUSY:: loadspritegfx ANIM_TAG_SMALL_EMBER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 42, 1 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0x8, 0x1F + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 8, RGB(31, 0, 0) call BurningJealousyFireBuffEffect delay 0x8 call BurningJealousyFireBuffEffect - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0x8, 0x1F + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 8, RGB(31, 0, 0) delay 0x4 call BurningJealousyFireBuffEffect waitforvisualfinish @@ -14785,7 +14785,7 @@ Move_LASH_OUT:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call PowerTripBuffUp delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x1F + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp delay 0x8 @@ -14861,7 +14861,7 @@ Move_CORROSIVE_GAS:: monbg ANIM_ATTACKER loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER, 0x8, 0x3 delay 0x0 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x1, 0x2, 0x0, 0xF, 0x19EF @;Garbage green + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 1, 2, 0, 15, RGB(15, 15, 6) @;Garbage green createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7a, 0x3, 0xfff2, 0x12, 0x2e delay 0x0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x79, 0x3, 0xe, 0xfff2, 0x2e @@ -14875,7 +14875,7 @@ Move_CORROSIVE_GAS:: createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7b, 0x3, 0x4, 0x4, 0x1e waitforvisualfinish playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendColorCycle, 0x2, (F_PAL_BG | F_PAL_TARGET | F_PAL_ATK_PARTNER | F_PAL_DEF_PARTNER), 0x1, 0x2, 0x0, 0xE, 0x19EF @;Garbage green + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_TARGET | F_PAL_ATK_PARTNER | F_PAL_DEF_PARTNER), 1, 2, 0, 14, RGB(15, 15, 6) @;Garbage green waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -14887,7 +14887,7 @@ Move_COACHING:: createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 1 waitforvisualfinish playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x1, 0x2, 0x0, 0xA, 0x1E5D + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 10, RGB(29, 18, 7) createvisualtask AnimTask_Splash, 2, ANIM_TARGET, 1 waitforvisualfinish end @@ -15121,7 +15121,7 @@ Move_WICKED_BLOW:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call WickedBlowBuffEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call WickedBlowBuffEffect delay 0x8 @@ -15264,7 +15264,7 @@ Move_DRAGON_ENERGY:: createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x2C5E @;Regidrago Reddish Reddish, Purple monbg ANIM_TARGET playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x4, 0x0, 0xB, 0x7F9F @;Pinkish White + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 4, 0, 11, RGB(31, 28, 31) @;Pinkish White waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS), 0x1, 0x10, 0x0, 0x2C5E @;Regidrago Reddish Reddish, Purple @@ -15328,7 +15328,7 @@ Move_FREEZING_GLARE:: createvisualtask AnimTask_GlareEyeDots, 0x5, 0x0 playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x2, 0x0, 0xC, 0x7f4c @;Ice blue + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(12, 26, 31) @;Ice blue createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 28, 1 call IceCrystalEffectShort waitforvisualfinish @@ -15583,7 +15583,7 @@ Move_POWER_SHIFT:: createsprite gSpriteTemplate_PowerShiftDefenseBall, ANIM_ATTACKER, 2, POWER_SHIFT_RIGHT_X, 0, POWER_SHIFT_LEFT_X, 0, POWER_SHIFT_DELAY, POWER_SHIFT_ARC waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x2, 0x0, 0xa, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 10, RGB(31, 31, 31) waitforvisualfinish clearmonbg ANIM_ATK_PARTNER end @@ -15625,7 +15625,7 @@ Move_SPRINGTIDE_STORM:: loadspritegfx ANIM_TAG_RED_HEART playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x6, 0x0, 0xB, 0x7ADF + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 6, 0, 11, RGB(31, 22, 30) call HurricaneGust call SpringtideStormHeartSwirl call HurricaneGust @@ -15716,7 +15716,7 @@ MysticalPowerFoeTwoRingsOnly: Move_RAGING_FURY:: loadspritegfx ANIM_TAG_SMALL_EMBER loopsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER, 0x8, 0x3 - createvisualtask AnimTask_BlendColorCycle, 0x2, (F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET), 0x2, 0x5, 0x3, 0x8, 0x1f + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET), 2, 5, 3, 8, RGB(31, 0, 0) createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 32, 8, 56, 6 call OutrageFlames call OutrageFlames @@ -15992,7 +15992,7 @@ Move_ESPER_WING:: monbg ANIM_TARGET call SetPsychicBackground playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x0, 0x2, 0x0, 0x8, 0x2ff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(31, 23, 0) waitforvisualfinish playsewithpan SE_M_WING_ATTACK, SOUND_PAN_ATTACKER call EsperWingBlade @@ -17260,7 +17260,7 @@ Move_REVERSAL: createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB_WHITE, 8, RGB_BLACK, 0 waitforvisualfinish delay 30 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 2, 0, 10, RGB_WHITE + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), 3, 2, 0, 10, RGB_WHITE delay 10 playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0 @@ -17914,7 +17914,7 @@ Move_PAY_DAY: Move_OUTRAGE: loadspritegfx ANIM_TAG_SMALL_EMBER loopsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER, 8, 3 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 2, 5, 3, 8, RGB(14, 13, 0) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET), 2, 5, 3, 8, RGB(14, 13, 0) createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 5, 4 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3 @@ -23922,7 +23922,7 @@ PresentHeal: Move_BATON_PASS: loadspritegfx ANIM_TAG_POKEBALL playsewithpan SE_M_BATON_PASS, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 2, 0, 11, RGB(31, 22, 30) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), 1, 2, 0, 11, RGB(31, 22, 30) createsprite gBatonPassPokeballSpriteTemplate, ANIM_ATTACKER, 2 end @@ -26446,13 +26446,13 @@ Status_MagmaStorm: loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 5, 8 createvisualtask AnimTask_SeismicTossBgAccelerateDownAtEnd, 3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1 - createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_ATTACKER | F_PAL_TARGET), 4, 2, 2, 0, 12, RGB(22, 9, 7) call FireSpinEffect call FireSpinEffect - createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_ATTACKER | F_PAL_TARGET), 4, 2, 2, 0, 12, RGB(22, 9, 7) call FireSpinEffect call FireSpinEffect - createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_ATTACKER | F_PAL_TARGET), 4, 2, 2, 0, 12, RGB(22, 9, 7) call FireSpinEffect restorebg waitbgfadeout @@ -26806,7 +26806,7 @@ General_MegaEvolution: monbg ANIM_ATTACKER setalpha 12, 8 loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 - createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 6, 0, 11, RGB(31, 31, 11) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(31, 31, 11) call MegaEvolutionParticles call MegaEvolutionParticles call MegaEvolutionParticles @@ -26863,7 +26863,7 @@ General_ZMoveActivate: waitbgfadein createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x0, 0x0, 0xFFFF playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x6, 0x0, 0xb, 0x76BC + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(28, 21, 29) call ZMoveBuffEffect call ZMoveBuffEffect call ZMoveBuffEffect @@ -26894,7 +26894,7 @@ General_TotemFlare:: monbg ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x0, 0x6, 0x0, 0xb, 0x1f + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(31, 0, 0) call RainbowEndureEffect call RainbowEndureEffect call RainbowEndureEffect @@ -26952,7 +26952,7 @@ General_PrimalReversion_Alpha: monbg ANIM_ATTACKER setalpha 12, 8 loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 - createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 6, 0, 11, RGB(31, 31, 11) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(31, 31, 11) call MegaEvolutionParticles call MegaEvolutionParticles call MegaEvolutionParticles @@ -26979,7 +26979,7 @@ General_PrimalReversion_Omega: monbg ANIM_ATTACKER setalpha 12, 8 loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 - createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 6, 0, 11, RGB(31, 31, 11) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(31, 31, 11) call MegaEvolutionParticles call MegaEvolutionParticles call MegaEvolutionParticles @@ -27206,7 +27206,7 @@ Move_ALL_OUT_PUMMELING: waitforvisualfinish call EndureEffect loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER 0x9 0x2 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x1f + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect waitforvisualfinish @@ -27573,7 +27573,7 @@ Move_CONTINENTAL_CRUSH:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call ContinentalCrashBuffEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x2dd3 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(19, 14, 11) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call ContinentalCrashBuffEffect delay 0x8 @@ -27606,14 +27606,14 @@ FinishContinentalCrush: delay 0x5 visible ANIM_ATTACKER delay 0x4 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x2dd3 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(19, 14, 11) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call ContinentalCrushStockpileRocks playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call ContinentalCrushStockpileRocks createsprite gContinentalCrushGrowingRockSpriteTemplate, ANIM_ATTACKER, 2, 0x0 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x2dd3 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(19, 14, 11) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call ContinentalCrushStockpileRocks @@ -27874,7 +27874,7 @@ Move_NEVER_ENDING_NIGHTMARE:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call NeverendingNightmareBuffEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x40c0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 6, 16) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call NeverendingNightmareBuffEffect delay 0x8 @@ -28322,7 +28322,7 @@ Move_HYDRO_VORTEX:: call HydroVortexBubbles loadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_WATERFALL, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5da0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 13, 23) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 waitforvisualfinish unloadspritegfx ANIM_TAG_SPLASH @@ -28973,7 +28973,7 @@ SubzeroSlammerFinish: waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 0x11 waitforvisualfinish call SubzeroSlammerIceSwirl - createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_ATTACKER, 0x2, 0x2, 0x0, 0xb, 0x7e80 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 20, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SubzeroSlammerIceSwirl call SubzeroSlammerIceSwirl @@ -29085,7 +29085,7 @@ Move_DEVASTATING_DRAKE:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call DevastatingDrakeBuffEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x40c0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 6, 16) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call DevastatingDrakeBuffEffect delay 0x8 @@ -29310,7 +29310,7 @@ Move_BLACK_HOLE_ECLIPSE:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x0000 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 0x8 @@ -29606,7 +29606,7 @@ Move_CATASTROPIKA:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 0x8 @@ -31050,7 +31050,7 @@ Move_OCEANIC_OPERETTA:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call OceanicOperettaBuffEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call OceanicOperettaBuffEffect delay 0x8 @@ -31254,7 +31254,7 @@ SplinteredStormshardsByPlayer: visible ANIM_ATTACKER delay 0x1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 delay 0x2 call SplinteredStormshardsPlayer_Rising2 @@ -31336,7 +31336,7 @@ SplinteredStormshardsByOpponent: visible ANIM_ATTACKER delay 0x1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 delay 0x2 call SplinteredStormshardsOpponent_Rising2 @@ -32003,7 +32003,7 @@ Move_SEARING_SUNRAZE_SMASH:: call SearingSunrazeSmashFlare delay 0x8 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x7fff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SearingSunrazeSmashFlare delay 0x8 @@ -32234,7 +32234,7 @@ Move_MENACING_MOONRAZE_MAELSTROM:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MenacingMoonrazeMaelstromFlare delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xc, 0x0000 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 12, RGB(0, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MenacingMoonrazeMaelstromFlare playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER @@ -32294,7 +32294,7 @@ MenacingMoonrazeMaelstromFinish: unloadspritegfx ANIM_TAG_METEOR @superpower playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call MenacingMoonrazeMaelstromChargeUp - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xc, 0x0000 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 12, RGB(0, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MenacingMoonrazeMaelstromChargeUp call MenacingMoonrazeMaelstromChargeUp @@ -32423,7 +32423,7 @@ Move_LIGHT_THAT_BURNS_THE_SKY:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x5bff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 0x8 @@ -32600,7 +32600,7 @@ Move_SOUL_STEALING_7_STAR_STRIKE:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SoulStealingSevenStarStrikeBuffEffect delay 0x8 - createvisualtask AnimTask_BlendColorCycle, 0x2, 0x2, 0x2, 0x2, 0x0, 0xb, 0x0 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 0, 0) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SoulStealingSevenStarStrikeBuffEffect delay 0x8 From e21346dd6748636832364c52a9dd060a835e34f0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 31 Jul 2023 16:58:08 -0400 Subject: [PATCH 102/111] Fixed Rage Powder's animation not turning the user red --- data/battle_anim_scripts.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 46e0dd8c5..c27860edb 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4870,7 +4870,7 @@ Move_RAGE_POWDER:: call RagePowderSprinkle call RagePowderSprinkle call RagePowderSprinkle - createvisualtask AnimTask_BlendColorCycle, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 0, 0) + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 0, 0) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end From 44eb6260cc099d7ce5ef1e527a810acffecb0bf5 Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Wed, 2 Aug 2023 02:10:18 +0300 Subject: [PATCH 103/111] [battle, anim] woodhammer animation overhaul (#3192) * [battle, anim] woodhammer animation overhaul * squashme: timings --------- Co-authored-by: sbird --- data/battle_anim_scripts.s | 43 +++--- .../sprites/wood_hammer_hammer.png | Bin 0 -> 400 bytes include/constants/battle_anim.h | 1 + include/graphics.h | 2 + src/battle_anim_effects_1.c | 126 +++++++++++++++++- src/data/battle_anim.h | 2 + src/data/pokemon/level_up_learnsets.h | 1 + src/graphics.c | 3 + 8 files changed, 153 insertions(+), 25 deletions(-) create mode 100644 graphics/battle_anims/sprites/wood_hammer_hammer.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index f41f541a1..95d7c1bc6 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4051,31 +4051,34 @@ Move_CHARGE_BEAM: end Move_WOOD_HAMMER: + loadspritegfx ANIM_TAG_WOOD_HAMMER + loadspritegfx ANIM_TAG_WOOD_HAMMER_HAMMER loadspritegfx ANIM_TAG_IMPACT - monbg ANIM_TARGET - setalpha 12, 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 2, 4 + createsprite gWoodHammerHammerSpriteTemplate, ANIM_TARGET, 2 + delay 60 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 + delay 18 + createvisualtask AnimTask_SquishTarget, 0x2 + delay 6 + call WoodHammerImpact waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 - delay 3 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, 0, 10, 0, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, 1, 0 - playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - delay 1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 0, 0, 4 - waitforvisualfinish - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 - waitforvisualfinish - delay 2 - createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 - delay 3 - createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 - waitforvisualfinish - clearmonbg ANIM_TARGET - blendoff end +WoodHammerImpact: + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, 0, 0, 20, 24, 14, 1 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, 5, 0, -20, 24, 14, 0 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, 0, 5, 20, -24, 14, 1 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, -5, 0, -20, -24, 14, 0 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, 0, 0, 20, 24, 20, 2 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, 5, 0, -20, 24, 20, 2 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, 0, 5, 20, -24, 20, 2 + createsprite gWoodHammerSmallSpriteTemplate, ANIM_TARGET, 2, -5, 0, -20, -24, 20, 2 + return + Move_AQUA_JET: loadspritegfx ANIM_TAG_SPARKLE_6 loadspritegfx ANIM_TAG_ROUND_SHADOW diff --git a/graphics/battle_anims/sprites/wood_hammer_hammer.png b/graphics/battle_anims/sprites/wood_hammer_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..00296d4c461b290f43871301e83164afb2f14eb3 GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`7zFr)xB}^W zQR5EdfP>}wLCWz6 zhRF5T&+T_}$@)_oE85JnBtbx$%{fZJYT3fdOA1-LemqfJvh(Jn;#>hMQMQOQc_FsK za^(-ROgMH1yYpsQHkTBAsOLSnbjrQJ<~p9=DYR`z+UUD22MV6vfanw8>@ zPA-nQDQU?{c6}QhIC@LM!*^X*JjFk+Eq#ue$*IRL?y)|P*b_M={3+|ny?llD^6I#j zDF*)k94Mi2YH?D`V)iD*!=Lp<_OjajeAA!vG47G{)Cvx%Z`(i2a&Qo>lgxUbSdw84 c0Z;cZeozxAuqm0%2=qOJr>mdKI;Vst06?>;Q~&?~ literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 01d4b6809..29c39b689 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -397,6 +397,7 @@ #define ANIM_TAG_STEEL_BEAM (ANIM_SPRITES_START + 383) #define ANIM_TAG_POLTERGEIST (ANIM_SPRITES_START + 384) #define ANIM_TAG_TEAPOT (ANIM_SPRITES_START + 385) +#define ANIM_TAG_WOOD_HAMMER_HAMMER (ANIM_SPRITES_START + 386) // battlers diff --git a/include/graphics.h b/include/graphics.h index 2d94fd726..25b3fd501 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -10161,6 +10161,8 @@ extern const u32 gBattleAnimSpriteGfx_ZMoveSymbol[]; extern const u32 gBattleAnimSpritePal_ZMoveSymbol[]; extern const u32 gBattleAnimSpriteGfx_Teapot[]; extern const u32 gBattleAnimSpritePal_Teapot[]; +extern const u32 gBattleAnimSpriteGfx_WoodHammerHammer[]; +extern const u32 gBattleAnimSpritePal_WoodHammerHammer[]; extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 7e3a6dc20..63aea3f80 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -147,6 +147,9 @@ static void AnimGrassKnotStep(struct Sprite *); static void AnimGrassKnot(struct Sprite *); static void AnimWoodHammerSmall(struct Sprite *); static void AnimWoodHammerBig(struct Sprite *); +static void AnimWoodHammerHammer(struct Sprite *); +static void AnimWoodHammerHammer_WaitForPunch(struct Sprite *); +static void AnimWoodHammerHammer_WaitForDestruction(struct Sprite *); static void AnimTask_DoubleTeam_Step(u8); static void AnimDoubleTeam(struct Sprite *); static void AnimNightSlash(struct Sprite *); @@ -2847,24 +2850,67 @@ const union AffineAnimCmd *const gWoodHammerBigAffineAnims[] = gWoodHammerBigAffineAnimCmd_2, }; -const union AnimCmd gWoodHammerSmallAnimCmd_1[] = +#define WOOD_HAMMER_SCALE_STEP 5 +#define WOOD_HAMMER_CC_ROTATION_STEP 2 +#define WOOD_HAMMER_BACKWARDS_DURATION 40 +#define WOOD_HAMMER_ROTATED_AMOUNT (WOOD_HAMMER_CC_ROTATION_STEP * WOOD_HAMMER_BACKWARDS_DURATION) +#define WOOD_HAMMER_SCALED_AMOUNT (WOOD_HAMMER_SCALE_STEP * WOOD_HAMMER_BACKWARDS_DURATION) + +const union AffineAnimCmd gWoodHammerHammerAffineAnimCmd_BackwardsRotateAndScale[] = { - ANIMCMD_FRAME(32, 1), - ANIMCMD_END, + AFFINEANIMCMD_FRAME(WOOD_HAMMER_SCALE_STEP, WOOD_HAMMER_SCALE_STEP, WOOD_HAMMER_CC_ROTATION_STEP, WOOD_HAMMER_BACKWARDS_DURATION), + AFFINEANIMCMD_END }; -const union AnimCmd gWoodHammerSmallAnimCmd_2[] = +const union AffineAnimCmd gWoodHammerHammerAffineAnimCmd_BackwardsRotateAndScaleFlipped[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(-WOOD_HAMMER_SCALE_STEP, WOOD_HAMMER_SCALE_STEP, -WOOD_HAMMER_CC_ROTATION_STEP, WOOD_HAMMER_BACKWARDS_DURATION), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gWoodHammerHammerAffineAnimCmd_PunchClockwise[] = +{ + AFFINEANIMCMD_FRAME(0x100 + WOOD_HAMMER_SCALED_AMOUNT, 0x100 + WOOD_HAMMER_SCALED_AMOUNT, WOOD_HAMMER_ROTATED_AMOUNT, 0), + AFFINEANIMCMD_FRAME(0, 0, -16, 7), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gWoodHammerHammerAffineAnimCmd_PunchCounterClockwise[] = +{ + AFFINEANIMCMD_FRAME(-0x100 - WOOD_HAMMER_SCALED_AMOUNT, 0x100 + WOOD_HAMMER_SCALED_AMOUNT, -WOOD_HAMMER_ROTATED_AMOUNT, 0), + AFFINEANIMCMD_FRAME(0, 0, 16, 7), + AFFINEANIMCMD_END +}; + +// Animations 0, 2 are for the player side attacking +// Animations 1, 3 are for the opponent side attacking (flipped) +const union AffineAnimCmd *const gWoodHammerHammerAffineAnims[] = +{ + gWoodHammerHammerAffineAnimCmd_BackwardsRotateAndScale, + gWoodHammerHammerAffineAnimCmd_BackwardsRotateAndScaleFlipped, + gWoodHammerHammerAffineAnimCmd_PunchClockwise, + gWoodHammerHammerAffineAnimCmd_PunchCounterClockwise, +}; + +const union AnimCmd gWoodHammerSmallAnimCmd_1[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END, }; -const union AnimCmd gWoodHammerSmallAnimCmd_3[] = +const union AnimCmd gWoodHammerSmallAnimCmd_2[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END, }; +const union AnimCmd gWoodHammerSmallAnimCmd_3[] = +{ + ANIMCMD_FRAME(80, 1), + ANIMCMD_END, +}; + const union AnimCmd *const gWoodHammerSmallAnims[] = { gWoodHammerSmallAnimCmd_1, @@ -2905,6 +2951,17 @@ const struct SpriteTemplate gWoodHammerSmallSpriteTemplate = .callback = AnimWoodHammerSmall, }; +const struct SpriteTemplate gWoodHammerHammerSpriteTemplate = +{ + .tileTag = ANIM_TAG_WOOD_HAMMER_HAMMER, + .paletteTag = ANIM_TAG_WOOD_HAMMER_HAMMER, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gWoodHammerHammerAffineAnims, + .callback = AnimWoodHammerHammer, +}; + const struct SpriteTemplate gJudgmentGrayOutwardSpikesTemplate = { .tileTag = ANIM_TAG_GREEN_SPIKE, @@ -3022,6 +3079,65 @@ static void AnimWoodHammerSmall(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } +#define HAMMER_X_OFFSET 40 +#define HAMMER_PUNCH_WAIT_FRAMES 37 + +static void AnimWoodHammerHammer(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + sprite->x += HAMMER_X_OFFSET; + StartSpriteAffineAnim(sprite, 1); + } + else + { + sprite->x -= HAMMER_X_OFFSET; + StartSpriteAffineAnim(sprite, 0); + } + sprite->data[6] = HAMMER_PUNCH_WAIT_FRAMES; + sprite->callback = AnimWoodHammerHammer_WaitForPunch; +} + +static void AnimWoodHammerHammer_WaitForPunch(struct Sprite *sprite) +{ + if (!sprite->affineAnimEnded) + return; + + if (sprite->data[6] != 0) + { + sprite->data[6]--; + if (sprite->data[6] & 1) + { + if ((sprite->data[6] / 2) & 1) + sprite->x2++; + else + sprite->x2--; + } + return; + } + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + StartSpriteAffineAnim(sprite, 3); + } + else + { + StartSpriteAffineAnim(sprite, 2); + } + sprite->callback = AnimWoodHammerHammer_WaitForDestruction; +} + +static void AnimWoodHammerHammer_WaitForDestruction(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + DestroySpriteAndMatrix(sprite); + } +} + +#undef HAMMER_X_OFFSET +#undef HAMMER_PUNCH_WAIT_FRAMES + // Animates the falling particles that horizontally wave back and forth. // Used by Sleep Powder, Stun Spore, and Poison Powder. // arg 0: initial x pixel offset diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index be1c7f07c..0a3c5d647 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1451,6 +1451,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_STEEL_BEAM}, {gBattleAnimSpriteGfx_AuraSphere, 0x200, ANIM_TAG_POLTERGEIST}, {gBattleAnimSpriteGfx_Teapot, 0x1800, ANIM_TAG_TEAPOT}, + {gBattleAnimSpriteGfx_WoodHammerHammer, 0x800, ANIM_TAG_WOOD_HAMMER_HAMMER}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1902,6 +1903,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_SteelBeam, ANIM_TAG_STEEL_BEAM}, {gBattleAnimSpritePal_Poltergeist, ANIM_TAG_POLTERGEIST}, {gBattleAnimSpritePal_Teapot, ANIM_TAG_TEAPOT}, + {gBattleAnimSpritePal_WoodHammerHammer, ANIM_TAG_WOOD_HAMMER_HAMMER}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h index 17af6b888..c29d77b03 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -15,6 +15,7 @@ static const struct LevelUpMove sBulbasaurLevelUpLearnset[] = { LEVEL_UP_MOVE(31, MOVE_WORRY_SEED), LEVEL_UP_MOVE(33, MOVE_SYNTHESIS), LEVEL_UP_MOVE(37, MOVE_SEED_BOMB), + LEVEL_UP_MOVE(56, MOVE_WOOD_HAMMER), LEVEL_UP_END }; diff --git a/src/graphics.c b/src/graphics.c index de65ac1c1..74feb5246 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -449,6 +449,9 @@ const u32 gBattleAnimSpriteGfx_SpinningBall[] = INCBIN_U32("graphics/battle_anim const u32 gBattleAnimSpritePal_SpinningBall[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball.gbapal.lz"); const u32 gBattleAnimSpritePal_SpinningBall2[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball_2.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.4bpp.lz"); +const u32 gBattleAnimSpritePal_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.gbapal.lz"); + // old battle interface data, unused const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.lz"); From 7a814999e5c482755591a4deab4e411d61842d45 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Mon, 31 Jul 2023 13:53:33 -0400 Subject: [PATCH 104/111] MOVE_CORROSIVE_GAS Effect (#3152) # Conflicts: # data/battle_anim_scripts.s # data/battle_scripts_1.s # include/constants/battle_move_effects.h --- asm/macros/battle_script.inc | 6 ++ data/battle_scripts_1.s | 24 +++++ include/constants/battle_move_effects.h | 3 +- include/constants/battle_string_ids.h | 3 +- src/battle_message.c | 2 + src/battle_script_commands.c | 19 +++- src/data/battle_moves.h | 2 +- test/move_effect_corrosive_gas.c | 119 ++++++++++++++++++++++++ 8 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 test/move_effect_corrosive_gas.c diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 47dc8092a..17163db37 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1380,6 +1380,12 @@ .byte \counter .4byte \ptr .endm + + .macro jumpifcantloseitem battler:req, ptr:req + callnative BS_JumpIfCantLoseItem + .byte \battler + .4byte \ptr + .endm @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ec6958d94..85ed81551 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -435,6 +435,30 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_COLLISION_COURSE .4byte BattleScript_EffectSpinOut @ EFFECT_SPIN_OUT .4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN + .4byte BattleScript_EffectCorrosiveGas @ EFFECT_CORROSIVE_GAS + +BattleScript_EffectCorrosiveGas: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + jumpifsubstituteblocks BattleScript_CorrosiveGasFail + jumpifcantloseitem BS_TARGET, BattleScript_CorrosiveGasFail + attackanimation + waitanimation + jumpifability BS_TARGET, ABILITY_STICKY_HOLD, BattleScript_StickyHoldActivates + setlastuseditem BS_TARGET + removeitem BS_TARGET + printstring STRINGID_PKMNITEMMELTED + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_CorrosiveGasFail: + pause B_WAIT_TIME_SHORT + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + printstring STRINGID_NOEFFECTONTARGET + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd BattleScript_EffectMakeItRain: setmoveeffect MOVE_EFFECT_PAYDAY diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index bb38d8659..27cc037af 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -412,7 +412,8 @@ #define EFFECT_COLLISION_COURSE 406 #define EFFECT_SPIN_OUT 407 #define EFFECT_MAKE_IT_RAIN 408 +#define EFFECT_CORROSIVE_GAS 409 -#define NUM_BATTLE_MOVE_EFFECTS 409 +#define NUM_BATTLE_MOVE_EFFECTS 410 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 174c611e2..5c8dc865d 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -664,8 +664,9 @@ #define STRINGID_SNOWCONTINUES 662 #define STRINGID_SNOWSTOPPED 663 #define STRINGID_SNOWWARNINGSNOW 664 +#define STRINGID_PKMNITEMMELTED 665 -#define BATTLESTRINGS_COUNT 665 +#define BATTLESTRINGS_COUNT 666 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, diff --git a/src/battle_message.c b/src/battle_message.c index c8f05fb9a..c4de3c06e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -799,9 +799,11 @@ static const u8 sText_ItemCuredSpeciesStatus[] = _("{B_BUFF1} had\nits status he static const u8 sText_ItemRestoredSpeciesPP[] = _("{B_BUFF1} had its\nPP restored!"); static const u8 sText_AtkTrappedDef[] = _("{B_ATK_NAME_WITH_PREFIX} trapped\nthe {B_DEF_NAME_WITH_PREFIX}!"); static const u8 sText_MirrorHerbCopied[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used its {B_LAST_ITEM}\nto mirror its opponent's stat changes!"); +static const u8 sText_PkmnItemMelted[] = _("{B_ATK_NAME_WITH_PREFIX} corroded\n{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_PKMNITEMMELTED - BATTLESTRINGS_TABLE_START] = sText_PkmnItemMelted, [STRINGID_MIRRORHERBCOPIED - BATTLESTRINGS_TABLE_START] = sText_MirrorHerbCopied, [STRINGID_THUNDERCAGETRAPPED - BATTLESTRINGS_TABLE_START] = sText_AtkTrappedDef, [STRINGID_ITEMRESTOREDSPECIESHEALTH - BATTLESTRINGS_TABLE_START] = sText_ItemRestoredSpeciesHealth, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1059967ed..006530e5f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7756,7 +7756,9 @@ static void Cmd_removeitem(void) itemId = gBattleMons[gActiveBattler].item; // Popped Air Balloon cannot be restored by any means. - if (GetBattlerHoldEffect(gActiveBattler, TRUE) != HOLD_EFFECT_AIR_BALLOON) + // Corroded items cannot be restored either. + if (GetBattlerHoldEffect(gActiveBattler, TRUE) != HOLD_EFFECT_AIR_BALLOON + && gBattleMoves[gCurrentMove].effect != EFFECT_CORROSIVE_GAS) gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gActiveBattler]][GetBattlerSide(gActiveBattler)] = itemId; // Remember if switched out gBattleMons[gActiveBattler].item = ITEM_NONE; @@ -9932,7 +9934,8 @@ static void Cmd_various(void) if (gBattleMons[gBattlerAttacker].item == ITEM_NONE || gBattleMons[gBattlerTarget].item != ITEM_NONE || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item)) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item) + || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]]) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -16071,6 +16074,18 @@ void BS_CheckParentalBondCounter(void) gBattlescriptCurrInstr = cmd->nextInstr; } +void BS_JumpIfCantLoseItem(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u8 battler = GetBattlerForBattleScript(cmd->battler); + u16 item = gBattleMons[battler].item; + + if (item == ITEM_NONE || !CanBattlerGetOrLoseItem(battler, item)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + void BS_GetBattlerSide(void) { NATIVE_ARGS(u8 battler); diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index bb1db2f7d..75a7d1b96 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -12302,7 +12302,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_CORROSIVE_GAS] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_CORROSIVE_GAS, TODO + .effect = EFFECT_CORROSIVE_GAS, .power = 0, .type = TYPE_POISON, .accuracy = 100, diff --git a/test/move_effect_corrosive_gas.c b/test/move_effect_corrosive_gas.c new file mode 100644 index 000000000..097646cee --- /dev/null +++ b/test/move_effect_corrosive_gas.c @@ -0,0 +1,119 @@ +#include "global.h" +#include "test_battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_CORROSIVE_GAS].effect == EFFECT_CORROSIVE_GAS); +} + +SINGLE_BATTLE_TEST("Corrosive Gas destroys the target's item or fails if the target has no item") +{ + u16 item; + + PARAMETRIZE {item = ITEM_NONE; } + PARAMETRIZE {item = ITEM_POTION; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) {Item(item); } + } WHEN { + TURN { MOVE(player, MOVE_CORROSIVE_GAS); } + } SCENE { + MESSAGE("Wobbuffet used CorrosiveGas!"); + if (item == ITEM_POTION) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CORROSIVE_GAS, player); + MESSAGE("Wobbuffet corroded Foe Wobbuffet's Potion!"); + } + else { + MESSAGE("It had no effect on Foe Wobbuffet!"); + } + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Corrosive Gas doesn't destroy the item of a Pokemon with the Sticky Hold ability") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MUK) {Item(ITEM_POISON_BARB); Ability(ABILITY_STICKY_HOLD); } + } WHEN { + TURN { MOVE(player, MOVE_CORROSIVE_GAS); } + } SCENE { + MESSAGE("Wobbuffet used CorrosiveGas!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CORROSIVE_GAS, player); + NOT MESSAGE("Wobbuffet corroded Foe Wobbuffet's Potion!"); + ABILITY_POPUP(opponent, ABILITY_STICKY_HOLD); + MESSAGE("Foe Muk's Sticky Hold made CorrosiveGas ineffective!"); + } THEN { + EXPECT_EQ(opponent->item, ITEM_POISON_BARB); + } +} + +SINGLE_BATTLE_TEST("Items lost to Corrosive Gas cannot be restored by Recycle") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_RECYCLE].effect == EFFECT_RECYCLE); + PLAYER(SPECIES_WOBBUFFET) {Speed(15); } + OPPONENT(SPECIES_WOBBUFFET) {Item(ITEM_ORAN_BERRY); Speed(10); } + } WHEN { + TURN { MOVE(player, MOVE_CORROSIVE_GAS); MOVE(opponent, MOVE_RECYCLE); } + } SCENE { + MESSAGE("Wobbuffet used CorrosiveGas!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CORROSIVE_GAS, player); + MESSAGE("Wobbuffet corroded Foe Wobbuffet's Oran Berry!"); + MESSAGE("Foe Wobbuffet used Recycle!"); + MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +DOUBLE_BATTLE_TEST("Corrosive Gas destroys foes and ally's items if they have one") +{ + // Check it affects all targets in all possible configurations. + u32 j, k, l; + u16 itemOpponentLeft, itemOpponentRight, itemPlayerLeft; + + for (j = 0; j < 2; j++) { + for (k = 0; k < 2; k++) { + for (l = 0; l < 2; l++) { + PARAMETRIZE {itemOpponentLeft = (j & 1) ? ITEM_ORAN_BERRY : ITEM_NONE; + itemOpponentRight = (k & 1) ? ITEM_CHESTO_BERRY : ITEM_NONE; + itemPlayerLeft = (l & 1) ? ITEM_CHERI_BERRY : ITEM_NONE; } + } + } + } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {Item(itemPlayerLeft);} + PLAYER(SPECIES_WYNAUT) {Item(ITEM_SITRUS_BERRY);} + OPPONENT(SPECIES_ABRA) {Item(itemOpponentLeft);} + OPPONENT(SPECIES_KADABRA) {Item(itemOpponentRight);} + } WHEN { + TURN { MOVE(playerRight, MOVE_CORROSIVE_GAS); } + } SCENE { + MESSAGE("Wynaut used CorrosiveGas!"); + if (itemPlayerLeft == ITEM_CHERI_BERRY) { + MESSAGE("Wynaut corroded Wobbuffet's Cheri Berry!"); + } else { + MESSAGE("It had no effect on Wobbuffet!"); + } + if (itemOpponentLeft == ITEM_ORAN_BERRY) { + MESSAGE("Wynaut corroded Foe Abra's Oran Berry!"); + } else { + MESSAGE("It had no effect on Foe Abra!"); + } + if (itemOpponentRight == ITEM_CHESTO_BERRY) { + MESSAGE("Wynaut corroded Foe Kadabra's Chesto Berry!"); + } else { + MESSAGE("It had no effect on Foe Kadabra!"); + } + + } THEN { + EXPECT_EQ(playerRight->item, ITEM_SITRUS_BERRY); // Attacker doesn't lose its item. + EXPECT_EQ(playerLeft->item, ITEM_NONE); + EXPECT_EQ(opponentLeft->item, ITEM_NONE); + EXPECT_EQ(opponentRight->item, ITEM_NONE); + } +} From 1d8ad1b75649ba043c9801cc6caa57d5541783e5 Mon Sep 17 00:00:00 2001 From: sbird Date: Wed, 2 Aug 2023 09:51:45 +0200 Subject: [PATCH 105/111] [battle, movesets] revert bulbasaur's level up change --- src/data/pokemon/level_up_learnsets.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h index c29d77b03..17af6b888 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -15,7 +15,6 @@ static const struct LevelUpMove sBulbasaurLevelUpLearnset[] = { LEVEL_UP_MOVE(31, MOVE_WORRY_SEED), LEVEL_UP_MOVE(33, MOVE_SYNTHESIS), LEVEL_UP_MOVE(37, MOVE_SEED_BOMB), - LEVEL_UP_MOVE(56, MOVE_WOOD_HAMMER), LEVEL_UP_END }; From b08b6a37cb150d49c900c7c04aca4cc5c17ddafe Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 25 Jul 2023 08:03:08 +0100 Subject: [PATCH 106/111] Optimize BuildOamBuffer --- gflib/sprite.c | 282 +++++++++++++++++++-------------------------- test/sprite.c | 303 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 417 insertions(+), 168 deletions(-) create mode 100644 test/sprite.c diff --git a/gflib/sprite.c b/gflib/sprite.c index 80fba81fe..d75f6f727 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -48,11 +48,7 @@ struct OamDimensions s8 height; }; -static void UpdateOamCoords(void); -static void BuildSpritePriorities(void); -static void SortSprites(void); -static void CopyMatricesToOamBuffer(void); -static void AddSpritesToOamBuffer(void); +static void SortSprites(u32 *spritePriorities, s32 n); static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); static void ResetOamMatrices(void); static void ResetSprite(struct Sprite *sprite); @@ -280,12 +276,12 @@ u32 gOamMatrixAllocBitmap; u8 gReservedSpritePaletteCount; EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0}; -EWRAM_DATA static u16 sSpritePriorities[MAX_SPRITES] = {0}; EWRAM_DATA static u8 sSpriteOrder[MAX_SPRITES] = {0}; EWRAM_DATA static bool8 sShouldProcessSpriteCopyRequests = 0; EWRAM_DATA static u8 sSpriteCopyRequestCount = 0; EWRAM_DATA static struct SpriteCopyRequest sSpriteCopyRequests[MAX_SPRITES] = {0}; EWRAM_DATA u8 gOamLimit = 0; +static EWRAM_DATA u8 gOamDummyIndex = 0; EWRAM_DATA u16 gReservedSpriteTileCount = 0; EWRAM_DATA static u8 sSpriteTileAllocBitmap[128] = {0}; EWRAM_DATA s16 gSpriteCoordOffsetX = 0; @@ -296,6 +292,7 @@ EWRAM_DATA bool8 gAffineAnimsDisabled = FALSE; void ResetSpriteData(void) { ResetOamRange(0, 128); + gOamDummyIndex = 0; ResetAllSprites(); ClearSpriteCopyRequests(); ResetAffineAnimData(); @@ -326,179 +323,128 @@ void AnimateSprites(void) void BuildOamBuffer(void) { - u8 temp; - UpdateOamCoords(); - BuildSpritePriorities(); - SortSprites(); - temp = gMain.oamLoadDisabled; + bool32 oamLoadDisabled; + u32 i, stride; + u8 oamIndex; + + // All attributes which affect sorting packed into a single u32: + // { priority:2, subpriority:8, y:9, :5, index:8 }. + // Index has its own byte even though it only needs 6 bits so that + // we can load it with a ldrb instead of having to mask out the + // bottom 6 bits. + u32 spritePriorities[MAX_SPRITES]; + s32 toSort = 0; + u8 skippedSprites[MAX_SPRITES]; + u32 skippedSpritesN = 0; + u32 matrices = 0; + + for (i = 0; i < MAX_SPRITES; i++) + { + // Reuse existing sSpriteOrder because we expect the order to be + // relatively stable between frames. + u32 index = sSpriteOrder[i]; + struct Sprite *sprite = &gSprites[index]; + s32 y; + if (!sprite->inUse || sprite->invisible) + { + skippedSprites[skippedSpritesN++] = index; + continue; + } + + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + matrices |= 1 << sprite->oam.matrixNum; + + if (sprite->coordOffsetEnabled) + { + sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; + sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; + } + + y = sprite->oam.y; + if (y >= DISPLAY_HEIGHT) + { + y -= 256; + } + else if (sprite->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite->oam.size == ST_OAM_SIZE_3) + { + u32 shape = sprite->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (y > 128) + y -= 256; + } + } + + // y in [-128...159], so (159 - y) in [0..287]. + spritePriorities[toSort++] + = (sprite->oam.priority << 30) + | (sprite->subpriority << 22) + | (((159 - y) & 0x1FF) << 13) + | (index << 0); + } + + SortSprites(spritePriorities, toSort); + + for (i = 0; i < toSort; i++) + sSpriteOrder[i] = spritePriorities[i] & 0xFF; + for (i = 0; i < skippedSpritesN; i++) + sSpriteOrder[toSort + i] = skippedSprites[i]; + + oamLoadDisabled = gMain.oamLoadDisabled; gMain.oamLoadDisabled = TRUE; - AddSpritesToOamBuffer(); - CopyMatricesToOamBuffer(); - gMain.oamLoadDisabled = temp; + + for (i = 0, oamIndex = 0; i < toSort; i++) + { + if (AddSpriteToOamBuffer(&gSprites[spritePriorities[i] & 0xFF], &oamIndex)) + break; + } + + for (i = oamIndex; i < gOamDummyIndex; i++) + gMain.oamBuffer[i] = gDummyOamData; + gOamDummyIndex = oamIndex; + + for (i = 0; matrices != 0; i++, matrices >>= 1) + { + if (matrices & 1) + { + u32 base = 4 * i; + gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; + gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; + gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; + gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; + } + } + + gMain.oamLoadDisabled = oamLoadDisabled; sShouldProcessSpriteCopyRequests = TRUE; } -void UpdateOamCoords(void) +static inline void InsertionSort(u32 *spritePriorities, s32 n) { - u8 i; - for (i = 0; i < MAX_SPRITES; i++) + s32 i = 1; + while (i < n) { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && !sprite->invisible) + u32 x = spritePriorities[i]; + s32 j = i - 1; + while (j >= 0 && spritePriorities[j] > x) { - if (sprite->coordOffsetEnabled) - { - sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; - sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; - } - } - } -} - -void BuildSpritePriorities(void) -{ - u16 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - u16 priority = sprite->subpriority | (sprite->oam.priority << 8); - sSpritePriorities[i] = priority; - } -} - -void SortSprites(void) -{ - u8 i; - for (i = 1; i < MAX_SPRITES; i++) - { - u8 j = i; - struct Sprite *sprite1 = &gSprites[sSpriteOrder[i - 1]]; - struct Sprite *sprite2 = &gSprites[sSpriteOrder[i]]; - u16 sprite1Priority = sSpritePriorities[sSpriteOrder[i - 1]]; - u16 sprite2Priority = sSpritePriorities[sSpriteOrder[i]]; - s16 sprite1Y = sprite1->oam.y; - s16 sprite2Y = sprite2->oam.y; - - if (sprite1Y >= DISPLAY_HEIGHT) - sprite1Y = sprite1Y - 256; - - if (sprite2Y >= DISPLAY_HEIGHT) - sprite2Y = sprite2Y - 256; - - if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite1->oam.size == ST_OAM_SIZE_3) - { - u32 shape = sprite1->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite1Y > 128) - sprite1Y = sprite1Y - 256; - } - } - - if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite2->oam.size == ST_OAM_SIZE_3) - { - u32 shape = sprite2->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite2Y > 128) - sprite2Y = sprite2Y - 256; - } - } - - while (j > 0 - && ((sprite1Priority > sprite2Priority) - || (sprite1Priority == sprite2Priority && sprite1Y < sprite2Y))) - { - u8 temp = sSpriteOrder[j]; - sSpriteOrder[j] = sSpriteOrder[j - 1]; - sSpriteOrder[j - 1] = temp; - - // UB: If j equals 1, then j-- makes j equal 0. - // Then, sSpriteOrder[-1] gets accessed below. - // Although this doesn't result in a bug in the ROM, - // the behavior is undefined. + spritePriorities[j + 1] = spritePriorities[j]; j--; -#ifdef UBFIX - if (j == 0) - break; -#endif - - sprite1 = &gSprites[sSpriteOrder[j - 1]]; - sprite2 = &gSprites[sSpriteOrder[j]]; - sprite1Priority = sSpritePriorities[sSpriteOrder[j - 1]]; - sprite2Priority = sSpritePriorities[sSpriteOrder[j]]; - sprite1Y = sprite1->oam.y; - sprite2Y = sprite2->oam.y; - - if (sprite1Y >= DISPLAY_HEIGHT) - sprite1Y = sprite1Y - 256; - - if (sprite2Y >= DISPLAY_HEIGHT) - sprite2Y = sprite2Y - 256; - - if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite1->oam.size == ST_OAM_SIZE_3) - { - u32 shape = sprite1->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite1Y > 128) - sprite1Y = sprite1Y - 256; - } - } - - if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite2->oam.size == ST_OAM_SIZE_3) - { - u32 shape = sprite2->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite2Y > 128) - sprite2Y = sprite2Y - 256; - } - } } - } -} - -void CopyMatricesToOamBuffer(void) -{ - u8 i; - for (i = 0; i < OAM_MATRIX_COUNT; i++) - { - u32 base = 4 * i; - gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; - gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; - gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; - gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; - } -} - -void AddSpritesToOamBuffer(void) -{ - u8 i = 0; - u8 oamIndex = 0; - - while (i < MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[sSpriteOrder[i]]; - if (sprite->inUse && !sprite->invisible && AddSpriteToOamBuffer(sprite, &oamIndex)) - return; + spritePriorities[j + 1] = x; i++; } +} - while (oamIndex < gOamLimit) - { - gMain.oamBuffer[oamIndex] = gDummyOamData; - oamIndex++; - } +static void SortSprites(u32 *spritePriorities, s32 n) +{ + InsertionSort(spritePriorities, n); } u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) @@ -849,7 +795,7 @@ void CopyToSprites(u8 *src) void ResetAllSprites(void) { - u8 i; + u32 i; for (i = 0; i < MAX_SPRITES; i++) { diff --git a/test/sprite.c b/test/sprite.c new file mode 100644 index 000000000..f488929d5 --- /dev/null +++ b/test/sprite.c @@ -0,0 +1,303 @@ +#include "global.h" +#include "test.h" +#include "main.h" +#include "malloc.h" +#include "random.h" +#include "sprite.h" + +#define OAM_MATRIX_COUNT 32 + +EWRAM_DATA static u16 sSpritePriorities[MAX_SPRITES] = {0}; +EWRAM_DATA static u8 sSpriteOrder[MAX_SPRITES] = {0}; + +static void Old_BuildOamBuffer(void); + +static void ExpectEqOamBuffers(const struct OamData *oldOamBuffer, const struct OamData *newOamBuffer) +{ + u32 i; + u32 matrices = 0; + + // Compare the non-matrix data. + for (i = 0; i < gOamLimit; i++) + { + EXPECT(memcmp(&oldOamBuffer[i], &newOamBuffer[i], 6) == 0); + if (newOamBuffer[i].affineMode & ST_OAM_AFFINE_ON_MASK) + matrices |= 1 << newOamBuffer[i].matrixNum; + } + + // Compare the matrix data. + for (i = 0; i < OAM_MATRIX_COUNT; i++) + { + if (matrices & (1 << i)) + { + u32 base = 4 * i; + EXPECT_EQ(oldOamBuffer[base + 0].affineParam, newOamBuffer[base + 0].affineParam); + EXPECT_EQ(oldOamBuffer[base + 1].affineParam, newOamBuffer[base + 1].affineParam); + EXPECT_EQ(oldOamBuffer[base + 2].affineParam, newOamBuffer[base + 2].affineParam); + EXPECT_EQ(oldOamBuffer[base + 3].affineParam, newOamBuffer[base + 3].affineParam); + } + } +} + +static void ResetSpriteData_(void) +{ + u32 i; + ResetSpriteData(); + for (i = 0; i < MAX_SPRITES; i++) + sSpriteOrder[i] = i; +} + +static void BenchmarkBuildOamBuffer(bool32 preSort) +{ + struct Benchmark oldBuildOamBuffer, newBuildOamBuffer; + struct OamData *oldOamBuffer = Alloc(sizeof(gMain.oamBuffer)); + + if (preSort) + Old_BuildOamBuffer(); + BENCHMARK(&oldBuildOamBuffer) + { + Old_BuildOamBuffer(); + } + memcpy(oldOamBuffer, gMain.oamBuffer, sizeof(gMain.oamBuffer)); + + if (preSort) + BuildOamBuffer(); + BENCHMARK(&newBuildOamBuffer) + { + BuildOamBuffer(); + } + + ExpectEqOamBuffers(oldOamBuffer, gMain.oamBuffer); + EXPECT_FASTER(newBuildOamBuffer, oldBuildOamBuffer); + Free(oldOamBuffer); +} + +TEST("BuildOamBuffer faster with no sprites") +{ + ResetSpriteData_(); + BenchmarkBuildOamBuffer(FALSE); +} + +TEST("BuildOamBuffer faster with max sprites (equal y/subpriority)") +{ + u32 i; + + ResetSpriteData_(); + for (i = 0; i < MAX_SPRITES; i++) + CreateSprite(&gDummySpriteTemplate, 0, 0, 0); + BenchmarkBuildOamBuffer(FALSE); +} + +TEST("BuildOamBuffer faster with max sprites (random y/subpriority)") +{ + u32 i; + ResetSpriteData_(); + SeedRng(0); + for (i = 0; i < MAX_SPRITES; i++) + CreateSprite(&gDummySpriteTemplate, 0, Random() % 256, Random() % 256); + BenchmarkBuildOamBuffer(FALSE); +} + +TEST("BuildOamBuffer faster on already-sorted max sprites") +{ + u32 i; + ResetSpriteData_(); + SeedRng(0); + for (i = 0; i < MAX_SPRITES; i++) + CreateSprite(&gDummySpriteTemplate, 0, Random() % 256, Random() % 256); + BenchmarkBuildOamBuffer(TRUE); +} + +TEST("BuildOamBuffer faster with mix of sprites") +{ + u32 i; + ResetSpriteData_(); + SeedRng(0); + for (i = 0; i < MAX_SPRITES / 2; i++) + { + u32 spriteId = CreateSprite(&gDummySpriteTemplate, 0, Random() % 256, Random() % 256); + gSprites[spriteId].invisible = Random() % 4 == 0; + } + BenchmarkBuildOamBuffer(FALSE); +} + +// Old implementation. + +#define UBFIX + +static void UpdateOamCoords(void) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if (sprite->inUse && !sprite->invisible) + { + if (sprite->coordOffsetEnabled) + { + sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; + sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; + } + } + } +} + +static void BuildSpritePriorities(void) +{ + u16 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + u16 priority = sprite->subpriority | (sprite->oam.priority << 8); + sSpritePriorities[i] = priority; + } +} + +static void SortSprites(void) +{ + u8 i; + for (i = 1; i < MAX_SPRITES; i++) + { + u8 j = i; + struct Sprite *sprite1 = &gSprites[sSpriteOrder[i - 1]]; + struct Sprite *sprite2 = &gSprites[sSpriteOrder[i]]; + u16 sprite1Priority = sSpritePriorities[sSpriteOrder[i - 1]]; + u16 sprite2Priority = sSpritePriorities[sSpriteOrder[i]]; + s16 sprite1Y = sprite1->oam.y; + s16 sprite2Y = sprite2->oam.y; + + if (sprite1Y >= DISPLAY_HEIGHT) + sprite1Y = sprite1Y - 256; + + if (sprite2Y >= DISPLAY_HEIGHT) + sprite2Y = sprite2Y - 256; + + if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite1->oam.size == ST_OAM_SIZE_3) + { + u32 shape = sprite1->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite1Y > 128) + sprite1Y = sprite1Y - 256; + } + } + + if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite2->oam.size == ST_OAM_SIZE_3) + { + u32 shape = sprite2->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite2Y > 128) + sprite2Y = sprite2Y - 256; + } + } + + while (j > 0 + && ((sprite1Priority > sprite2Priority) + || (sprite1Priority == sprite2Priority && sprite1Y < sprite2Y))) + { + u8 temp = sSpriteOrder[j]; + sSpriteOrder[j] = sSpriteOrder[j - 1]; + sSpriteOrder[j - 1] = temp; + + // UB: If j equals 1, then j-- makes j equal 0. + // Then, sSpriteOrder[-1] gets accessed below. + // Although this doesn't result in a bug in the ROM, + // the behavior is undefined. + j--; +#ifdef UBFIX + if (j == 0) + break; +#endif + + sprite1 = &gSprites[sSpriteOrder[j - 1]]; + sprite2 = &gSprites[sSpriteOrder[j]]; + sprite1Priority = sSpritePriorities[sSpriteOrder[j - 1]]; + sprite2Priority = sSpritePriorities[sSpriteOrder[j]]; + sprite1Y = sprite1->oam.y; + sprite2Y = sprite2->oam.y; + + if (sprite1Y >= DISPLAY_HEIGHT) + sprite1Y = sprite1Y - 256; + + if (sprite2Y >= DISPLAY_HEIGHT) + sprite2Y = sprite2Y - 256; + + if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite1->oam.size == ST_OAM_SIZE_3) + { + u32 shape = sprite1->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite1Y > 128) + sprite1Y = sprite1Y - 256; + } + } + + if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite2->oam.size == ST_OAM_SIZE_3) + { + u32 shape = sprite2->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite2Y > 128) + sprite2Y = sprite2Y - 256; + } + } + } + } +} + +static void CopyMatricesToOamBuffer(void) +{ + u8 i; + for (i = 0; i < OAM_MATRIX_COUNT; i++) + { + u32 base = 4 * i; + gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; + gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; + gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; + gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; + } +} + +static void AddSpritesToOamBuffer(void) +{ + u8 i = 0; + u8 oamIndex = 0; + + while (i < MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[sSpriteOrder[i]]; + if (sprite->inUse && !sprite->invisible && AddSpriteToOamBuffer(sprite, &oamIndex)) + return; + i++; + } + + while (oamIndex < gOamLimit) + { + gMain.oamBuffer[oamIndex] = gDummyOamData; + oamIndex++; + } +} + +static void Old_BuildOamBuffer(void) +{ + u8 temp; + UpdateOamCoords(); + BuildSpritePriorities(); + SortSprites(); + temp = gMain.oamLoadDisabled; + gMain.oamLoadDisabled = TRUE; + AddSpritesToOamBuffer(); + CopyMatricesToOamBuffer(); + gMain.oamLoadDisabled = temp; + //sShouldProcessSpriteCopyRequests = TRUE; +} From 0bace94dc724ed1a170eed12a7755eaa09c94bd8 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 3 Aug 2023 14:46:45 -0300 Subject: [PATCH 107/111] Updated Cmd_jumpifsideaffecting --- src/battle_script_commands.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 32477451b..8b69e36fb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4183,11 +4183,7 @@ static void Cmd_jumpifsideaffecting(void) u32 flags; const u8 *jumpInstr; - if (cmd->battler == BS_ATTACKER) - side = GET_BATTLER_SIDE(gBattlerAttacker); - else - side = GET_BATTLER_SIDE(gBattlerTarget); - + side = GET_BATTLER_SIDE(GetBattlerForBattleScript(cmd->battler)); flags = cmd->flags; jumpInstr = cmd->jumpInstr; From e7bc42fcafd269c3f46c70568fa0655ac965b1eb Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 3 Aug 2023 21:17:39 +0200 Subject: [PATCH 108/111] use IsValidForBattle --- src/battle_controller_opponent.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 4b8820f9b..a786dafa6 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1707,8 +1707,7 @@ static void OpponentHandleChoosePokemon(void) for (chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) { - if (GetMonData(&gEnemyParty[chosenMonId], MON_DATA_HP) != 0 - && GetMonData(&gEnemyParty[chosenMonId], MON_DATA_SPECIES) != SPECIES_NONE + if (IsValidForBattle(&gEnemyParty[chosenMonId]) && chosenMonId != gBattlerPartyIndexes[battler1] && chosenMonId != gBattlerPartyIndexes[battler2] && (!(AI_THINKING_STRUCT->aiFlags & AI_FLAG_ACE_POKEMON) From 4ae6ae4de361f20841450124632b41b15c5b9f46 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Fri, 4 Aug 2023 02:57:06 -0400 Subject: [PATCH 109/111] Reset all battler IDs at battle start (#3111) * reset battler IDs before BattleScript_OverworldTerrain and BattleScript_OverworldWeatherStarts to prevent playanimation from executing on invalid battler ids * replace BS_SCRIPTING with BS_BATTLER_0 in BattleScript_OverworldTerrain and BattleScript_OverworldWeatherStarts --------- Co-authored-by: ghoulslash --- data/battle_scripts_1.s | 4 ++-- src/battle_main.c | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8a574a70f..0fd5f87c6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6793,14 +6793,14 @@ BattleScript_SunlightFaded:: BattleScript_OverworldWeatherStarts:: printfromtable gWeatherStartsStringIds waitmessage B_WAIT_TIME_LONG - playanimation_var BS_ATTACKER, sB_ANIM_ARG1 + playanimation_var BS_BATTLER_0, sB_ANIM_ARG1 call BattleScript_ActivateWeatherAbilities end3 BattleScript_OverworldTerrain:: printfromtable gTerrainStringIds waitmessage B_WAIT_TIME_LONG - playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG + playanimation BS_BATTLER_0, B_ANIM_RESTORE_BG call BattleScript_ActivateTerrainEffects end3 diff --git a/src/battle_main.c b/src/battle_main.c index eea745356..962de9e4e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3129,6 +3129,9 @@ static void BattleStartClearSetData(void) gBattlerAttacker = 0; gBattlerTarget = 0; + gEffectBattler = 0; + gBattleScripting.battler = 0; + gBattlerAbility = 0; gBattleWeather = 0; gHitMarker = 0; From 5226935857e77b85259fa5aece46eb431709da3f Mon Sep 17 00:00:00 2001 From: Eclipse <115349505+SubzeroEclipse@users.noreply.github.com> Date: Sat, 5 Aug 2023 04:56:05 +0200 Subject: [PATCH 110/111] =?UTF-8?q?Fixed=20Trainer=20class=20ball=20not=20?= =?UTF-8?q?assigned=20to=20second=20Pok=C3=A9mon=20(#3203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/battle_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_main.c b/src/battle_main.c index 5841f8f61..b75c44b77 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -1964,7 +1964,6 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer u8 fixedIV; s32 i, j; u8 monsCount; - s32 ball = -1; if (battleTypeFlags & BATTLE_TYPE_TRAINER && !(battleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_HILL))) @@ -1986,6 +1985,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer for (i = 0; i < monsCount; i++) { + s32 ball = -1; u32 personalityHash = GeneratePartyHash(trainer, i); if (trainer->doubleBattle == TRUE) personalityValue = 0x80; From 833f7dd9d3e500fb60680b079419f6acd528d573 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 6 Aug 2023 20:25:23 -0400 Subject: [PATCH 111/111] LF shenanigans --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 100 +++++++++--------- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 100 +++++++++--------- .../ISSUE_TEMPLATE/03_feature_requests.yaml | 54 +++++----- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 100 +++++++++--------- 4 files changed, 177 insertions(+), 177 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 55d4fada4..c4404a039 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -1,50 +1,50 @@ -name: βš”οΈ Battle Engine mechanical bugs πŸ› -description: File a bug report related to battle mechanic, be it moves, abilities and/or items. -labels: ["bug", "status: unconfirmed", "category: battle-mechanic"] -body: - - type: markdown - attributes: - value: | - Please fill in all required fields with as many details as possible. - - type: textarea - id: description - attributes: - label: Description - description: | - Describe the issue you are experiencing. - Attach images/videos if possible. - placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video - validations: - required: true - - type: dropdown - id: version - attributes: - label: Version - description: What version of pokeemerald-expansion are you using as a base? - options: - - 1.5.1 (Default) - - upcoming (Edge) - - 1.5.0 - - 1.4.3 - - 1.4.2 - - 1.4.1 - - 1.4.0 - - pre-1.4.0 - validations: - required: true - - type: input - id: upcomingversion - attributes: - label: Upcoming Version - description: If you're using the upcoming branch, please specify what was the commit hash you pulled from. - validations: - required: false - - type: input - id: contact - attributes: - label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). - placeholder: ex. Lunos#4026 - validations: - required: false +name: βš”οΈ Battle Engine mechanical bugs πŸ› +description: File a bug report related to battle mechanic, be it moves, abilities and/or items. +labels: ["bug", "status: unconfirmed", "category: battle-mechanic"] +body: + - type: markdown + attributes: + value: | + Please fill in all required fields with as many details as possible. + - type: textarea + id: description + attributes: + label: Description + description: | + Describe the issue you are experiencing. + Attach images/videos if possible. + placeholder: | + Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + validations: + required: true + - type: dropdown + id: version + attributes: + label: Version + description: What version of pokeemerald-expansion are you using as a base? + options: + - 1.5.1 (Default) + - upcoming (Edge) + - 1.5.0 + - 1.4.3 + - 1.4.2 + - 1.4.1 + - 1.4.0 + - pre-1.4.0 + validations: + required: true + - type: input + id: upcomingversion + attributes: + label: Upcoming Version + description: If you're using the upcoming branch, please specify what was the commit hash you pulled from. + validations: + required: false + - type: input + id: contact + attributes: + label: Discord contact info + description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + placeholder: ex. Lunos#4026 + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 8c28b3942..a24757fc7 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -1,50 +1,50 @@ -name: 🧠 Battle AI bugs πŸ› -description: File a bug report related to battle AI. -labels: ["bug", "status: unconfirmed", "category: battle-ai"] -body: - - type: markdown - attributes: - value: | - Please fill in all required fields with as many details as possible. - - type: textarea - id: description - attributes: - label: Description - description: | - Describe the issue you are experiencing. - Attach images/videos if possible. - placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video - validations: - required: true - - type: dropdown - id: version - attributes: - label: Version - description: What version of pokeemerald-expansion are you using as a base? - options: - - 1.5.1 (Default) - - upcoming (Edge) - - 1.5.0 - - 1.4.3 - - 1.4.2 - - 1.4.1 - - 1.4.0 - - pre-1.4.0 - validations: - required: true - - type: input - id: upcomingversion - attributes: - label: Upcoming Version - description: If you're using the upcoming branch, please specify what was the commit hash you pulled from. - validations: - required: false - - type: input - id: contact - attributes: - label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). - placeholder: ex. Lunos#4026 - validations: - required: false +name: 🧠 Battle AI bugs πŸ› +description: File a bug report related to battle AI. +labels: ["bug", "status: unconfirmed", "category: battle-ai"] +body: + - type: markdown + attributes: + value: | + Please fill in all required fields with as many details as possible. + - type: textarea + id: description + attributes: + label: Description + description: | + Describe the issue you are experiencing. + Attach images/videos if possible. + placeholder: | + Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + validations: + required: true + - type: dropdown + id: version + attributes: + label: Version + description: What version of pokeemerald-expansion are you using as a base? + options: + - 1.5.1 (Default) + - upcoming (Edge) + - 1.5.0 + - 1.4.3 + - 1.4.2 + - 1.4.1 + - 1.4.0 + - pre-1.4.0 + validations: + required: true + - type: input + id: upcomingversion + attributes: + label: Upcoming Version + description: If you're using the upcoming branch, please specify what was the commit hash you pulled from. + validations: + required: false + - type: input + id: contact + attributes: + label: Discord contact info + description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + placeholder: ex. Lunos#4026 + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/03_feature_requests.yaml b/.github/ISSUE_TEMPLATE/03_feature_requests.yaml index 79e85709f..682f0dc09 100644 --- a/.github/ISSUE_TEMPLATE/03_feature_requests.yaml +++ b/.github/ISSUE_TEMPLATE/03_feature_requests.yaml @@ -1,27 +1,27 @@ -name: πŸ™ Feature Request πŸ™ -description: Do you want a feature to be added to the Expansion? Let us know! -labels: ["feature-request"] -body: - - type: markdown - attributes: - value: | - Please fill in all required fields with as many details as possible. - - type: textarea - id: description - attributes: - label: Description - description: | - Describe the issue you are experiencing. - Attach images/videos if possible. - placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video - validations: - required: true - - type: input - id: contact - attributes: - label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). - placeholder: ex. Lunos#4026 - validations: - required: false +name: πŸ™ Feature Request πŸ™ +description: Do you want a feature to be added to the Expansion? Let us know! +labels: ["feature-request"] +body: + - type: markdown + attributes: + value: | + Please fill in all required fields with as many details as possible. + - type: textarea + id: description + attributes: + label: Description + description: | + Describe the issue you are experiencing. + Attach images/videos if possible. + placeholder: | + Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + validations: + required: true + - type: input + id: contact + attributes: + label: Discord contact info + description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + placeholder: ex. Lunos#4026 + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 6f11d5b9a..e25695c0b 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -1,50 +1,50 @@ -name: πŸ’Ύ Other errors πŸ–₯️ -description: Everything else that doesn't fit in the above categories. -labels: ["bug", "status: unconfirmed"] -body: - - type: markdown - attributes: - value: | - Please fill in all required fields with as many details as possible. - - type: textarea - id: description - attributes: - label: Description - description: | - Describe the issue you are experiencing. - Attach images/videos if possible. - placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video - validations: - required: true - - type: dropdown - id: version - attributes: - label: Version - description: What version of pokeemerald-expansion are you using as a base? - options: - - 1.5.1 (Default) - - upcoming (Edge) - - 1.5.0 - - 1.4.3 - - 1.4.2 - - 1.4.1 - - 1.4.0 - - pre-1.4.0 - validations: - required: true - - type: input - id: upcomingversion - attributes: - label: Upcoming Version - description: If you're using the upcoming branch, please specify what was the commit hash you pulled from. - validations: - required: false - - type: input - id: contact - attributes: - label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). - placeholder: ex. Lunos#4026 - validations: - required: false +name: πŸ’Ύ Other errors πŸ–₯️ +description: Everything else that doesn't fit in the above categories. +labels: ["bug", "status: unconfirmed"] +body: + - type: markdown + attributes: + value: | + Please fill in all required fields with as many details as possible. + - type: textarea + id: description + attributes: + label: Description + description: | + Describe the issue you are experiencing. + Attach images/videos if possible. + placeholder: | + Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + validations: + required: true + - type: dropdown + id: version + attributes: + label: Version + description: What version of pokeemerald-expansion are you using as a base? + options: + - 1.5.1 (Default) + - upcoming (Edge) + - 1.5.0 + - 1.4.3 + - 1.4.2 + - 1.4.1 + - 1.4.0 + - pre-1.4.0 + validations: + required: true + - type: input + id: upcomingversion + attributes: + label: Upcoming Version + description: If you're using the upcoming branch, please specify what was the commit hash you pulled from. + validations: + required: false + - type: input + id: contact + attributes: + label: Discord contact info + description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + placeholder: ex. Lunos#4026 + validations: + required: false